我做的一个项目,通过图像数据库检索,当我发现的结果,一些查询 - 5数据库图像,我想直观地显示结果。我不会将所有图像保存在内存中,因此我必须先加载图像才能显示图像。使用OpenCV
用于此目的的OpenCV - 关闭图像显示窗口
for image 1..5
load images
display image in a window
wait for any keypress
close the window
这里是我的代码片段在C++
:
IplImage *img;
for (int i=0; i < 5; ++i){
img = cvLoadImage(images[i].name.c_str(),1);
cvShowImage(("Match" + images[i].name).c_str(), img);
cvWaitKey(0);
cvDestroyWindow(("Match" + images[i].name).c_str());
// sleep(1);
cvReleaseImage(&img);
}
这里使用的images
数组不作为
我脑海中简单,在伪代码如我的代码中存在,但为了这个问题,它包含相对于当前程序运行点的图像的文件名(如果其成员为name
)。我在项目中存储图像名称有点不同。
上述几乎作品的代码:我可以通过4/5的图像OK迭代,但是当最后显示的图像和一键被按下时,图像会灰色的,我不能关闭图像窗口withouth的崩溃休息我的应用程序。
我的第一个想法是,由于编译时优化,cvReleaseImage
在cvDestroyWindow
完成之前释放图像,并以某种方式使其冻结。但是,我尝试添加一些等待时间(因此我的代码中已注释掉sleep(1)
行),并没有帮助。
我从我的控制台应用程序调用此显示功能,当图像冻结,控制返回到我的申请,我可以继续使用它(但在图像窗口仍然在后台冻结)。
你能给我如何解决这个问题有什么建议?
编辑
,因为问的问题我交谈过的一些人与计算机视觉和OpenCV定期处理,仍然没有想法。
我也发现了类似的stackoverflow question,但仍然没有公认的答案。 Googleing只是提供了类似的问题,但没有答案。
什么尝试(即使它们不是完整的解决方案)的任何想法非常赞赏。
你可以告诉我们关于图像数组?你可以发布它的创建和分配代码吗?顺便说一句,你把它标记为C++,那么你为什么要使用旧的C风格的opencv? – Boaz 2012-01-13 07:11:30
C风格的OpenCv是因为我不得不使用C库与我的代码使用OpenCV和一些数据是C风格的OpenCV数据结构。这实际上是一个更大代码的片段,我以不同的方式访问我的图像的名称。为了这个问题,images数组包含文件路径到.name成员中的图片(我将更新问题) – penelope 2012-01-13 08:04:17
您是否尝试过'cvDestroyAllWindows()'?如果是这样,并且它不起作用,那么代码中的某处(可能不在上面)或OpenCv中有一个奇怪的错误。如果它有效,那么就有一个简单的错误。 – Florian 2012-01-25 19:45:36