访问OpenCV中cvMat图像中的像素值

时间:2013-12-16 12:58:07

标签: c++ opencv image-processing

我使用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的小圆圈(由颈点定义),它检测到一个点和边缘。 neckcenter.y是从早期计算得出的常数值。我在这做错了什么?

输出代码 -

The diamond points should come on the edges whereas they are coming on black space

3 个答案:

答案 0 :(得分:2)

在应用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);

答案 1 :(得分:1)

语法:

contours.at<uchar>(i,j)

就数据类型(即灰度图像)而言,您的情况是正确的。这条线可能暗示了这个问题:

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

使用at访问OpenCV像素时,必须将像素位置指定为(row, col),因此您的索引方向错误。在您访问像素的所有位置尝试此操作:

contours.at<uchar>(j,i)

来自OpenCV documentation

enter image description here

答案 2 :(得分:0)

你有一个unsigned char类型的3通道图像。要访问它,您应该使用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的信息?