OpenCV的imshow()函数无法工作

15

我已经编写了一个OpenCV代码,我的代码有以下语句:

cv::imshow("Matches", matchesImg);
cv::waitKey(0);

无论是调试还是发布代码,我都无法看到显示输出的窗口。

每个项目都出现这种情况,不知道原因,有人可以指导一下吗?

我在Windows 7和Visual Studio 2010上进行编码,并使用OpenCV版本2.4.6。


你能演示一下你如何确定 matchesImg 是有效的吗?你得到了什么错误? - KobeJohn
确保matchesImg不为空。 - ChronoTrigger
2
遇到类似的问题,看看这个是否有效:cv::namedWindow("Matches"); cv::imshow("Matches", matchesImg); cv::waitKey(); - Alexey
1
@CTZStef 是的,你说得对。你应该把它作为答案发布!我认为在OpenCV中必须显式地首先使用namedWindow创建一个窗口是一个错误。 - Alexey
1
@Armin Mustafa,您能否发一些围绕您提供的这两行代码的更多代码,以便我们了解为什么cv::namedWindow("Matches");似乎可以解决这个问题?此外,您是使用预编译版本的OpenCV还是自己重新构建的版本?还有其他值得注意的事情,比如OpenGL或QT吗? - Bull
显示剩余3条评论
1个回答

6
如我在评论中提到的,您需要使用与imshow中相同的窗口名称来先创建一个窗口,可以使用namedWindow函数。 有关详细信息,请参见此教程编辑 这里强烈建议您事先创建窗口。有些人可能会认为,在以前的OpenCV版本中,它并不是这样工作的。然后,我们可以说这个解决方案至少适用于OpenCV 2.4.6,这也是我们关心的版本(并且它解决了问题)。

1
虽然这可能适用于2.4.6版本,但对我来说(至少)在2.4.4版本上不适用。 - Bull
1
我刚刚检查了2.4.4的源代码。imshow()只是调用了cvShowImage(),并且至少在Windows上,如果命名窗口不存在,则会调用cvNamedWindow()来创建它。因此,你的答案不适用于在Windows 7上运行的OpenCV 2.4.4,也可能不适用于其他平台。 - Bull
2
在您提供的链接中,我没有看到任何暗示(即使是微弱的)窗口必须事先创建。查看函数imshow()的C++源代码,我发现它只是调用了C函数cvShowImage()。您可以在https://github.com/Itseez/opencv/blob/2.4.6/modules/highgui/src/window.cpp上看到这一点。此外,您还可以在https://github.com/Itseez/opencv/blob/2.4.6/modules/highgui/src/window_w32.cpp上看到`cvShowImage()`的功能。您可以自己试试吗?可能OP的代码还有其他问题。这些链接适用于OpenCV 2.4.6。 - Bull
1
如果您想要非默认窗口属性,您需要调用namedWindow() - Bull
1
@CTZStef - KeillRandor是正确的。别浪费时间看教程了,直接看源码!imshow()调用了cvShowImage(),至少对于Windows而言,如果窗口不存在,将执行以下代码:cvNamedWindow(name, CV_WINDOW_AUTOSIZE);。只有在某种情况下CV_WINDOW_AUTOSIZE不适合您时,才需要首先调用namedWindow()。另外,也许icvFindWindowByName()确实存在错误。但这不影响我——从来没用过namedWindow() - Bull
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接