2012-08-16 53 views
3

我是OpenCV的入門者。我的編程環境是VC++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。OpenCV 2.4.2 imread函數導致運行時錯誤

我在VC++和Path中使用純粹的32位配置。

我在下面的代碼鍵入:

#include "opencv2\highgui\highgui.hpp" 
#include "opencv2\core\core.hpp" 
using namespace cv; 

int main(int argc, char** argv) { 
    char* imgPath = "logo.png"; 
    Mat img = imread(imgPath); 
    namedWindow("Example1", WINDOW_AUTOSIZE); 
    imshow("Example1", img); 
    waitKey(0); 
    return 0; 
} 

然後我編譯和運行。它想出了一個窗口(但沒有圖片),但是給了我這個(運行時錯誤?)

Unhandled exception at 0x770515de in Helloworld2.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ef038.. 

然後我改變了imread到cvLoadImage和它的作品沒有任何錯誤。

有人可以告訴我什麼是錯?

回答

2

我試過了你給出的代碼。它與我的OpenCV安裝完美結合。

但是我在該行得到一個警告:

char* imgPath = "logo.png"; 

main.cpp:6:21: warning: deprecated conversion from string constant to 'char*' [- 

Wwrite串]

我認爲這是沒有嚴重到讓代碼崩潰,但它可能是你的情況的問題,因爲我不使用VC++編譯。

什麼,你可以嘗試檢查,如果是這樣的問題是直接與字符串替換imgPath,所以現在的代碼會像

Mat img = imread("logo.png"); 
0

cvLoadImageimread之間的差異可以在OpenCV的文件中可以看出:

C++:墊imread(常量字符串&文件名,INT標誌= 1)

C:*與CvMat cvLoadImageM(爲const char *文件名,INT iscolor = CV_LOAD_IMAGE_COLOR)

但有一個隱式轉換從const char *string。正如masad指出的那樣,這種轉換已經被廢棄了,所以它非常依賴於編譯器。

至於cvLoadImage爲你的作品,看來你應該改變你的代碼是這樣的:

#include "opencv2\highgui\highgui.hpp" 
#include "opencv2\core\core.hpp" 
#include <string> 
using namespace cv; 

int main(int argc, char** argv) { 
    std::string imgPath("logo.png"); 
    Mat img = imread(imgPath); 
    namedWindow("Example1", WINDOW_AUTOSIZE); 
    imshow("Example1", img); 
    waitKey(0); 
    return 0; 
} 

目前已在Visual Studio中的一些problems與C++接口,但您可以嘗試,看看它是否爲你工作。

0

我遇到了同樣的問題,並且遇到了Installing OpenCV 2.4.3 in Visual C++ 2010 Express,它提到在爲鏈接器添加依賴關係時使用更新的庫集* d.lib。我試過了,C++接口工作。不確定一般情況是否如此。我在64位Windows機器上使用OpenCV 2.4和Visual Studio 2010。

1

我也遇到了這個問題,但我用下面的方法修復了它。重點是使用除相對路徑以外的絕對路徑,並在文件路徑中將「\」替換爲「/」。

#include <opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 

int main() { 
    cv::Mat image = cv::imread("D:/projects/test/Debug/1.jpg"); 
    if (image.empty()) { 
     return 0; 
    } 
    cv::namedWindow("my image"); 
    cv::imshow("my image", image); 
    cv::waitKey(5000); 
    return 1; 
} 
0

我收到了類似的問題。當我用imread函數,程序崩潰,系統錯誤消息: opencv_debug.exe中的0x0036299f處未處理的異常:0000005:讀取位置0xcccccccc時發生訪問衝突

然後我改變了imread成cvLoadImage,它的工作原理沒有任何錯誤。

最後,我修復了這個問題,它是因爲我用VS2008項目編譯了VS2010編譯的dll

這是我的故事。

環境:VS2008 + opencv2.4.7

首先,我只是按照鏈接http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html,並編譯我的測試項目。

但是,當我運行我的測試項目時,系統錯誤對話框告訴我,我丟失了MSVCP100D.dll MSVCR100D.dll。所以我下載了這兩個DLL,這個DLL丟失問題就解決了,但是這個問題在運行時崩潰了。

注意提前鏈接,它說: setx command

這意味着,在opencv2.4.7,他們只提供在VS2010或vs2012,不是VS2008編譯的DLL。

當我使用由vs2010編譯的dll編譯vs2008項目時,我遇到了有線問題。

我該如何解決這個問題?

  1. 使用舊版本的OpenCV如opencv2.3,該版本包含編譯的.dll文件的VS2008。 vc9

  2. 自己編譯opencv。

我注意到你的環境是:VC++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。 確保OPENCV_DIR設置正確。

setx -m OPENCV_DIR D:\ OpenCV \ Build \ x64 \ vc10