2014-04-24 87 views
0

那麼,我是openCV和圖像處理領域的新手,我絕對需要幫助。我需要獲取Mat的每個像素值。此圖像由網絡攝像頭捕獲(實時)。 我嘗試了一些解決方案,從一些人的問題,但它不是在我的項目上工作。 這是我的一些代碼:如何在OpenCV中使用網絡攝像頭獲取Mat圖像的像素值

Mat blackWhite; 
    Mat binary; 
    Mat distanceTr; 
    cvtColor(frame, blackWhite, CV_BGR2GRAY); 
    GaussianBlur(blackWhite, blackWhite, Size(15,15), 6.5, 6.5); 
    threshold(blackWhite, binary, 80, 255, CV_THRESH_BINARY); 
    Mat invBinary = Scalar(255) - binary; 
    distanceTransform(invBinary, distanceTr, CV_DIST_L2,3); 

我的像素值訪問,我做了這個:

for(int i = 0; i < distanceTr.rows; i++) 
{ 
    for(int j = 0; j < distanceTr.cols; j++) 
    { 
     if(distanceTr.at<uchar>(0,0) == 0) 
     { 
      cout << 1; 
     } 
    } 
} 

對於網絡攝像頭秀,我用

imshow("Project", distanceTr); 

據據我所知,distanceTr是一個灰度圖像,所以它是一個1通道圖像。基於一些答案,我嘗試了.at <>但它不工作:( 我正在做一個測試用例,如果(0,0)像素是黑色的,它將打印1.我得到的是未處理的異常錯誤。 你能給任何幫助,好嗎?

非常感謝你。 (對不起,我英文不好)

+1

'distanceTrandform'的輸出圖像類型爲'CV_32FC1',因此可能您應該做這個:'if(distanceTr.at (0,0)== 0)cout << 1' – sgarizvi

+0

@ sgar91好的,非常感謝。現在正在工作。 :) 我在哪裏可以得到什麼類型的圖像給出什麼樣的輸出信息?像這種情況一樣,distanceTransform生成CV_32FC1。 – user3567271

+0

爲什麼你在循環中一遍又一遍地檢查同一個位置(0,0)?沒有任何意義。 – berak

回答

2

distanceTransform輸出圖像爲CV_32FC1類型,因此每個像素float類型。要訪問像素值,您必須執行以下操作:

if(distanceTr.at<float>(0,0) == 0) 
{ 
    cout<<1; 
} 

opencv documentation中,給出了每個函數參數的說明,如圖像的大小和類型等。

+0

其他人有問題可以訪問[distanceTransform()](http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#distancetransform)? – berak

+0

@berak ...沒有。什麼問題? – sgarizvi

+0

頁面加載不正確。如果它適合你,nvm。 – berak