2012-05-05 164 views
0

我正在使用cv :: imread來加載圖像並使用該圖像執行一些處理,但我不知道爲什麼我無法讀取返回的Mat的值來自imread函數。 我用Mat.at方法:無法訪問從OpenCV函數返回的Mat的值

Mat iplimage = imread("Photo.jpg",1); //input 
    for(int i=0;i<iplimage.rows;i++){ 
     for(int j=0;j<iplimage.cols;j++){ 
      cout<<(int)iplimage.at<int>(i,j)<<" "; 
     } 
     cout<<endl; 
    } 

但它出現了一個錯誤:

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((Sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) -1))*4) & 15) == elemSize1()) is unknown function, file: "c:\opencv2.2\include\opencv2\core\mat.hpp", line 517

但是,如果使用直接訪問方式,它是確定的:

Mat iplimage = imread("Photo.jpg",1); //input 
    for(int i=0;i<iplimage.rows;i++){ 
     for(int j=0;j<iplimage.cols;j++){ 
     cout<<(int)iplimage.data[i*iplimage.cols + j]<<" ";     
     } 
    cout<<endl; 
    } 

誰能告訴我如何使用Mat.at方法訪問上面的Mat? 感謝您的幫助!

回答

0

看到這個answer。在你的情況下,返回的Mat是3維的,因此iplimage.at<int>未能斷言,你只需要像上述答案所解釋的那樣訪問每個通道的強度。

+0

我不想用CV ::拆分功能,因爲我需要獲得灰度圖像。如果拆分它,那麼我需要手動轉換成灰色圖像。我認爲如果我使用OpenCV函數進行這類工作,效果會更好。而且,我也試圖與imread(「Photo.jpg」,0),但同樣的問題依然發生。你能幫我解決這個問題??? –

+0

我正在使用0pencv2.2,問題的原因是什麼? –

0

你正在試圖與圖像的3個信道來加載,如果你改變該墊的IplImage = imread(「Photo.jpg」,0)會被罰款; //輸入

+0

如果我將圖像作爲灰度圖像加載,情況相同。我也無法通過Mat.at訪問。 –

0

我找到了解決方案。這是因爲我用: inputImage.at<int>(i,j)inputImage.at<float>(1,2) 代替,(int)inputImage.at<uchar>(1,2)(float)inputImage.at<uchar>(1,2) 對不起,我不小心!