2014-05-09 112 views
1

我想這個代碼通過這個代碼來計算我的二值圖像的像素值:如何讀取OpenCV中的像素值?

int main() 
{ 
    Mat img; 

    img=imread("/home/2b.jpeg", CV_LOAD_IMAGE_UNCHANGED); 
    namedWindow("win", WINDOW_AUTOSIZE); 
    imshow("win", img); 

    for(int i=0; i< img.rows ;i++) 
    { 
     for(int j=0; j< img.cols ; j++) 
     { 
      cout<<setw(10)<<img.at<int>(i,j); 
     } 
     cout<<endl<<endl<<endl; 
    } 

    waitKey(0); 

    return 0; 
} 

,但我得到3種類型的值:0,-1和一些大的不同號碼,如(24342234,1324244242,等等)

什麼問題?我在繪畫程序中繪製了一條黑線,並保存圖像,或從互聯網上下載二進制圖像,但得到的結果相同!

我想當我使用二進制圖像我必須得到0爲白色像素和255爲黑色的。

回答

2

首先,你要訪問它的像素,uchar型(unsigned char),而不是int

cout,你必須明確地轉換爲其他類型,比如int爲了正確打印,因爲cout將打印unsigned char時,當其值大於127更大的工作怪異。否則,它將打印一些垃圾值(或什麼也不是),因爲它只是一個不可打印 ASCII字符無論如何打印。檢查出Why "cout" works weird for "unsigned char"?

cout << setw(10) << (int) img.at<uchar>(i,j); 
        ^^^^^  ^^^^^    
0

嘗試將其加載爲CV_IMAGE_GRAYSCALE,並使用image.at< uchar>(y,x)訪問像素值。

+0

謝謝!它的工作,但我想知道爲什麼當我選擇CV_LOAD_IMAGE_(其他選項),它不工作? – user3486308

+0

@ user3486308對於灰度圖像,它應該適用於'CV_IMAGE_GRAYSCALE'和'CV_LOAD_IMAGE_UNCHANGED'(<0,即加載圖像原樣(包括alpha通道,如果存在的話) – herohuyongtao

+0

謝謝herohuyongtao。 – user3486308

0

您試圖訪問整數值,而實際上你的墊子是uchar。嘗試環線內更改爲:

cout<<setw(10)<<img.at<uchar>(i,j); 
+0

它仍然會產生當像素值大於127時出現意外結果。查看我的答案以獲取詳細信息。 – herohuyongtao