2014-09-22 98 views
2

這裏是我的代碼:imread()無法正常工作

#include<opencv\cv.h> 
    #include<opencv\highgui.h> 
    using namespace cv; 
    using namespace std; 

    int main() 
     { 
      Mat src; 
      //src.create(200,500,CV_8UC3); 
      src = imread("a.bmp", 1); 
      namedWindow("Display window", WINDOW_AUTOSIZE); 
      if(!src.data)        
       cout<<"Could not open or find the image" << std::endl ; 
      else 
       imshow("Display window", src); 
      waitKey(0); 
      return 0; 
     } 

它總是執行if部分
當我使用的src.create代替imread()它顯示一個空的圖像。

+0

爲什麼你使用1作爲impread的第二個參數而不是「bmp」?格式1的含義是什麼? – 2014-09-22 01:24:57

+0

嘗試給你的圖像的完整路徑。它不能讀取文件'a.bmp',以便進入'if'。如果您使用創建,它只顯示一個空白圖像。這是假設你的'imread()'格式是正確的。我沒有檢查過。 – 2014-09-22 03:29:42

回答

7

要調試您的問題,您應該嘗試確認圖像路徑是否正確。

正如評論中所建議的,嘗試指定文件的完整絕對路徑。記得使用轉義斜槓,如果你使用的是Windows(如c:\ a.bmp將需要「C:\ a.bmp」)

OR

如果您正在執行從Visual Studio應用程序那麼您可以將工作目錄配置爲位圖的目錄! (OpenCV cvLoadImage() does not load images in visual studio debugger?

您還可以嘗試使用cvLoadImage而不是imread。如果cvLoadImage可以打開該文件,那麼它可能是你有發佈和調試庫的混合導致你一個問題,因爲每個:

+0

我嘗試了一切,但都失敗了。那麼我使用OpenCV-2.4.9來解壓它有兩個目錄,一個是源代碼,另一個是源代碼,在它包含的兩個目錄中都包含文件夾。並在其他包括目錄我只包括bulid的包括,是否正確? – 2014-09-22 17:05:39

+0

如果include目錄和庫不正確,那麼你將能夠編譯或鏈接你的應用程序。 如果您在使用絕對路徑時遇到問題,請通過下面的示例找到可執行文件的完整路徑:http://stackoverflow.com/questions/298510/how-to-get-the-current-directory- in-ac-program 然後把位圖放在它告訴你的工作目錄中。 – Fuzz 2014-09-23 05:31:21

+0

我的問題是我在調試模式下使用了發佈庫。感謝您的最後一個鏈接! – Mauker 2016-10-10 18:59:05

4

如果圖像文件無法讀取,OpenCV文檔中提到的imread()會返回空矩陣(Mat :: data == NULL)。

http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#imread

您應檢查「a.bmp」文件是在當前工作目錄。 IDE(visual studio)可以故意設置可執行文件的工作目錄(Debug/... Release/...)。假設「a.bmp」是一個有效的BMP文件,並且您具有正確的文件系統讀取權限,則使用絕對路徑「a.bmp」或從命令行在預期的目錄中啓動可執行文件也將有所幫助。

+0

我嘗試了一切,但都失敗了。那麼我使用OpenCV-2.4.9來解壓它有兩個目錄,一個是源代碼,另一個是源代碼,在它包含的兩個目錄中都包含文件夾。 和額外的包括目錄我只包括bulid的包括,是否正確? – 2014-09-22 16:58:15

+1

您是否嘗試過我們建議的絕對路徑?像'imread(「C:\\ path \\ to \\ a.bmp」)'例如。如果你得到的文件路徑是正確的,庫問題@Fuzz指出可能是導致你的問題的另一個來源。我還沒有在Visual Studio上開發OpenCV,但我認爲這個bug仍然存在。 – dexjq23 2014-09-23 01:20:52

1

我有視覺studion了同樣的問題, imread返回空數據。

img = cv::imread("c:\\data\\a.bmp",1); 

注意\\分隔符使窗口能夠正確解析路徑。