OpenCV 的奇怪行为

Posted

技术标签:

【中文标题】OpenCV 的奇怪行为【英文标题】:Strange behavior with OpenCV 【发布时间】:2010-10-03 17:58:43 【问题描述】:

当我在 Visual C++ 2005 中编译我的 Windows 应用程序(称为 CrosslinesDetection)(包括计算机视觉库 OpenCV 1.1)时,我没有收到任何编译或链接错误,但是当我运行它时,它到达一个点并冻结,而 Windows 会显示以下内容:

"Unhandled exception at 0x7c915223 in CrosslinesDetection.exe:
0xC0000005: Access violation writing location 0x00030ffc."

程序是一个普通的C++ Windows Applikation,有两行OpenCV代码:

IplImage *img = cvCreateImage( cvSize( 1024, 768 ), IPL_DEPTH_8U, 1 );
cvReleaseImage( &img );

现在奇怪的行为是,如果我 - 包括 OpenCV 行,程序抛出异常 - 排除 OpenCV 行,程序正常运行。

我在另一个项目中使用 OpenCV 库没有任何问题。特别是,我为 GUI 制作了一个 C# 项目,并在后台编译为 DLL 的 C++ 项目。如果我为上述行创建这样的解决方案,我在执行过程中没有问题。

有没有人知道,什么可能导致这个错误?

感谢您的帮助,斯特凡


感谢cmets。

同时,我使用一个最小的项目进行测试。

我仍然不完全理解这个问题,但与此同时,我发现当我包含第三方库(来自 uEye)时会发生异常。

如果我在项目中使用来自 OpenCV 和 uEye 库的单个函数,则会发生异常。如果我使用来自 OpenCV 或 uEye 的单个函数,则不会引发异常。因此,这些与库似乎有些不兼容,或者还有另一个问题。但是,我不知道如何检测它。


不,不是在这一点上。在最小示例中,功能是不相关的。一个函数初始化相机,另一个函数初始化图像结构。


但也许错误在别处......

我在 Visual Studio 中创建了一个 C++ Windows 窗体应用程序。我在 Form1.h 文件中添加了一个按钮以及相应的功能:

private: System::Void Form1_Click(System::Object^  sender, System::EventArgs^  e) 
  OpenCamera();
  IplImage * img = cvCreateImageHeader( cvSize( 1024, 768 ), IPL_DEPTH_8U, 1);
  cvReleaseImage( &img );
  CloseCamera();

我在 Form1.h 的开头添加了标题:

#include "CameraControl.h"
#include "cv.h"

然后,我必须关闭预编译头选项,我必须从 /clr:pure 更改为 /clr 选项才能成功编译和链接项目。

但是,然后我运行程序,上面提到的异常被抛出......

我想知道,如果我滥用了 C++ Windows 窗体应用程序并且我不应该包含我的纯 C++ 代码,或者 OpenCV 或 uEye 库是否真的存在问题。

【问题讨论】:

如果你在调试器中运行程序会发生什么? Visual Studio 应该向您显示哪一行存在访问冲突。如果您只是取消注释第一行怎么办?它还会崩溃吗? 【参考方案1】:

我建议在本机项目中测试相同的代码,而不使用托管代码。 MFC 或 Win32 控制台应用程序。

【讨论】:

【参考方案2】:

不是吗

cvReleaseImage( img );

? (与号已删除) 您还应该检查正确的调用约定。

【讨论】:

cvReleaseImage 的签名是“void cvReleaseImage(IplImage** image)”,所以当你通过引用传递 img 时,你传递的是指针的内存位置(指向指针的指针)【参考方案3】:

我刚刚使用 OpenCV 1.0 和 Visual Studio 2008 运行并编译了这些确切的行,没有任何错误。也许尝试创建一个空项目,它什么都不做,只包含 cxcore.h 标头,然后运行这两行。

也只是对另一张海报:没有&符号是规范的一部分,他在那里是正确的。抱歉,我会将其作为评论发布,但目前还不能。

【讨论】:

以上是关于OpenCV 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

triangulatePoints() 方法的奇怪行为

opencv打印奇怪的黑色图像

cv::circle 的奇怪行为

在 qlabel 上显示 openCv 视频的奇怪问题

Opencv + Visual Studio 2008 奇怪的调试问题

从 OpenCV 距离变换中得到奇怪的结果