2009-01-27 262 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控制檯應用程序。