[英]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.