#1
by ace-k@ » 5年前
複数箇所のカメラ視点(約3000箇所)からOpenGLのglReadPixelsで描画した画面を画像(2000×1000pix)にし,画像処理をするコードを書いています.しかし,ループで繰り返し処理をしていくと,メモリがどんどん増大し,最終的にメモリがいっぱいになり,落ちてしまいます.
以下が実際に実装したコードですが,何が原因なのでしょうか.
コード:
// ●●.h
cv::Mat mesh_rgb_image_f; // RGB画像(float型)
cv::Mat mesh_rgb_image_u; // RGB画像(uchar型)
// ●●.cpp
void ReadPixels(int i, int width, int height){
mesh_rgb_image_f.create(cv::Size(width, height), CV_32FC3);
// フレームバッファの内容を取得
glReadPixels(0, 0, width, height, GL_BGR, GL_FLOAT, mesh_rgb_image_f.data);
cv::flip(mesh_rgb_image_f, mesh_rgb_image_f, -1);
mesh_rgb_image_f.convertTo(mesh_rgb_image_u, CV_8UC3, 255);
}
// ○○.cpp
for(int i = 0; i < pos_num; i++){ // pos_num=3000
// ウインドウを設定し,カメラ視点を算出する関数
bool ortho = true; // 平行投影
pDoc->_vis.ViewCamera(ortho, i, WIDTH2, HEIGHT2);
DrawVisibilityMesh(); // メッシュを描画
// glReadPixels()によりRGB画像を取得して格納
pDoc->_vis.ReadPixels(i, WIDTH2, HEIGHT2);
// 画像処理する関数
pDoc->_vis.CalculateMeshParameters(i);
cv::waitKey(0); // 何かキーを押すまで待機
// 画像メモリ解放
pDoc->_vis.mesh_rgb_image_u.release();
}
pDoc->_vis.mesh_rgb_image_f.release();
cv::destroyAllWindows();
複数箇所のカメラ視点(約3000箇所)からOpenGLのglReadPixelsで描画した画面を画像(2000×1000pix)にし,画像処理をするコードを書いています.しかし,ループで繰り返し処理をしていくと,メモリがどんどん増大し,最終的にメモリがいっぱいになり,落ちてしまいます.
以下が実際に実装したコードですが,何が原因なのでしょうか.
[code]
// ●●.h
cv::Mat mesh_rgb_image_f; // RGB画像(float型)
cv::Mat mesh_rgb_image_u; // RGB画像(uchar型)
// ●●.cpp
void ReadPixels(int i, int width, int height){
mesh_rgb_image_f.create(cv::Size(width, height), CV_32FC3);
// フレームバッファの内容を取得
glReadPixels(0, 0, width, height, GL_BGR, GL_FLOAT, mesh_rgb_image_f.data);
cv::flip(mesh_rgb_image_f, mesh_rgb_image_f, -1);
mesh_rgb_image_f.convertTo(mesh_rgb_image_u, CV_8UC3, 255);
}
// ○○.cpp
for(int i = 0; i < pos_num; i++){ // pos_num=3000
// ウインドウを設定し,カメラ視点を算出する関数
bool ortho = true; // 平行投影
pDoc->_vis.ViewCamera(ortho, i, WIDTH2, HEIGHT2);
DrawVisibilityMesh(); // メッシュを描画
// glReadPixels()によりRGB画像を取得して格納
pDoc->_vis.ReadPixels(i, WIDTH2, HEIGHT2);
// 画像処理する関数
pDoc->_vis.CalculateMeshParameters(i);
cv::waitKey(0); // 何かキーを押すまで待機
// 画像メモリ解放
pDoc->_vis.mesh_rgb_image_u.release();
}
pDoc->_vis.mesh_rgb_image_f.release();
cv::destroyAllWindows();
[/code]