簡體   English   中英

在OpenCV中訪問cvMat圖像中的像素值

[英]Access pixel value in a cvMat image in OpenCV

我使用Canny邊緣檢測器成功識別了給定圖像的邊緣。 我正在努力尋找在此檢測到的邊緣線上的特定點。

我的方法:

我在opencv中使用了cv::canny函數,並且輸出以cv::Mat格式存儲。 我想遍歷矩陣的所有值並標識出存在邊緣的所有那些像素,以便可以檢測到檢測到的邊緣線上的特定點。

使用的功能:

cv::Canny(frame_gray,contours,50,150);

輸出存儲在contours ,其類型為CV_8UC3

要訪問像素值,已經嘗試過

contours.at<int>(i,j) != 0

並且

contours.at<uchar>(i,j) != 0

將不勝感激上面的幫助。 如果該方法是正確的並且缺少某些東西,否則我應該嘗試另一種方法,謝謝

編輯:

for(int i=0;i<img_width;i++)
 { 
  if((int)contours.at<uchar>(i,neckcenter.y) > 0 ) 
  { 
    Point multipoints(i,neckcenter.y); 
    circle( contours, multipoints, neckpoint, Scalar( 255, 0, 0 ),4, 8, 0 );
    cout << (int)contours.at<uchar>(i,neckcenter.y) << endl; 
  }
 }

我正在使用上面的代碼,該代碼形成一個半徑為1的小圓圈(由頸點定義),在其中檢測到點和邊緣上的點。 eckcenter.y是從先前的計算得出的常數。 我在這里做錯了什么?

代碼輸出-

菱形點應在邊緣上,而它們應在黑色空間上

您可能需要在應用Canny之前進行灰度傳遞:

Mat gray;
cvtColor(bgr,gray,CV_BGR2GRAY); // now gray is a 8bit, uchar Mat

Mat contours;
cv::Canny(gray,contours,50,150);

// now you're safe to use:
uchar value = contours.at<uchar>(i,j);

語法:

contours.at<uchar>(i,j)

就數據類型(即灰度圖像)而言,對於您的情況是正確的。 該行可能暗示了該問題:

for(int i=0;i<img_width;i++)

當您使用at訪問OpenCV像素at ,必須將像素位置指定為(row, col) ,因此索引的方式是錯誤的。 在所有訪問像素的地方嘗試以下操作:

contours.at<uchar>(j,i)

OpenCV文檔中

在此處輸入圖片說明

您有一個3通道圖像,類型為unsigned char。 要訪問它,您應該使用cv :: Vec3b類型。 這是操作方法:

int channel = 0;//or 1 or 2
contours.at<cv::Vec3b>(i,j)[channel]

要檢查所有元素是否均為0:

contours.at<cv::Vec3b>(i,j)[0]==0 && contours.at<cv::Vec3b>(i,j)[1]==0 && contours.at<cv::Vec3b>(i,j)[2]==0

但是,從哪里可以得到輪廓的圖像類型為CV_8UC3的信息?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM