【发布时间】:2012-02-09 04:53:23
【问题描述】:
我正在做一个搜索图像数据库的项目,当我找到一些查询的结果 - 5 个数据库图像时,我想直观地显示结果。我不会将所有图像都保存在内存中,所以我会先加载图像以显示它。
我的想法很简单,用伪代码写成:
for image 1..5
load images
display image in a window
wait for any keypress
close the window
这是我在C++ 中的代码的sn-p,为此使用OpenCV:
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,但是当显示最后一个图像并按下一个键时,图像变灰,我无法关闭图像窗口不会使我的应用程序的其余部分崩溃。
我的第一个想法是,由于编译时优化,cvReleaseImage 在cvDestroyWindow 完成之前释放图像,并且不知何故使其冻结。但是,我尝试添加一些等待时间(因此注释掉了我的代码的 sleep(1) 行),但没有帮助。
我从控制台应用程序调用此显示功能,当图像冻结时,控件返回到我的应用程序,我可以继续使用它(但图像窗口仍然在后台冻结)。
你能给我一些关于如何解决这个问题的建议吗?
编辑
自从提出这个问题后,我定期与一些处理计算机视觉和 OpenCV 的人交谈,但仍然没有任何想法。
我也找到了类似的stackoverflow question,但仍然没有接受的答案。谷歌搜索结果只是给出了类似的问题,但没有答案。
非常感谢有关尝试什么的任何想法(即使它们不是完整的解决方案)。
【问题讨论】:
-
您能告诉我们有关图像数组的哪些信息?你能发布它的创建和分配代码吗?顺便说一句,您将其标记为 c++,那么您为什么使用旧的 C 风格的 opencv?
-
OpenCv 的 C 风格是因为我必须使用一个 C 库,该库在我的代码中使用 OpenCV,并且一些数据采用 C 风格的 OpenCV 数据结构。这个 si 实际上是一个更大的代码的 sn-p,我访问我的图像名称的方式大不相同。为了这个问题, images 数组包含 .name 成员中图片的文件路径(我会更新问题)
-
你试过
cvDestroyAllWindows()吗?如果是这样,并且它不起作用,那么您的代码中的某个地方(可能不在上面)或 OpenCv 中都有一个奇怪的错误。如果它有效,那么某处就有一个简单的错误。 -
您能否提供示例代码、示例图像和示例图像名称来重现观察到的行为?