我使用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是从早期计算得出的常数值。我在这做错了什么?
输出代码 -
答案 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)
答案 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的信息?