2009-01-27 255 views
2

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

"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#项目,并在后台编译了一个C++项目作为DLL编译。如果我为上述线创建这样的解决方案,我在执行期间没有问题。

有没有人有想法,可能会导致这个错误?

感谢您的帮助,斯特凡


感谢您的意见。

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

我还没有完全理解这个问题,但同时,我发现,当我包含第三方库(来自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(); 
} 

而且我加了headeras在开始Form1.h的:

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

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

但是,后来我跑我不知道该程序的上述异常被抛出...

,如果我错用C++ Windows窗体应用程序,我不应该inlcude我的纯C++代码或者如果真有OpenCV或uEye库的问题。

+0

如果你在调试器中运行程序会发生什么? Visual Studio应该告诉你哪一行有访问冲突。 如果您只取消注释第一行,该怎么办?它仍然崩溃? – 2009-01-27 17:31:58

回答

0

是不是

cvReleaseImage(img); 

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

+0

cvReleaseImage的签名是“void cvReleaseImage(IplImage ** image)”,所以当你通过引用传递img时,你传递的是指针的内存位置(指向指针的指针) – QueueHammer 2009-10-05 20:47:45

0

我刚刚运行并用OpenCV 1.0和Visual Studio 2008编译了这些确切的行,没有错误。也许尝试创建一个空白的项目,除了包含cxcore.h头文件外,其他都不做,然后运行这两行代码。

也只是对另一个海报:没有&符号是规范的一部分,他在那里是正确的。对不起,我会张贴这个评论,但还不能。

1

我会建议测试这个相同的代码在本地项目,没有托管代码。 MFC或Win32控制台应用程序。