我已经使用Canny边缘检测器成功地识别了给定图像的边缘。我正在努力寻找这条检测到的边缘线上的特定点。
我的方法是:
我使用了opencv中的cv::canny函数,输出以cv::Mat格式存储。我想遍历矩阵的所有值,并识别出存在边缘的所有像素,这样我就可以检测到检测到的边缘线上的特定点。
使用的函数:
cv::Canny(frame_gray,contours,50,150);输出存储在CV_8UC3类型的contours中
要访问像素值,请尝试
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是从先前的计算中导出的常量值。我在这里做错了什么?
代码的输出-

发布于 2013-12-16 21:01:54
在应用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);发布于 2013-12-16 22:18:24
语法:
contours.at<uchar>(i,j)在数据类型(即灰度图像)方面是适合您的情况的。下面这行可能暗示了这个问题:
for(int i=0;i<img_width;i++)当您使用at访问OpenCV像素时,您必须将像素位置指定为(row, col),因此您的索引是错误的。在所有访问像素的地方尝试以下操作:
contours.at<uchar>(j,i)从OpenCV documentation

发布于 2013-12-17 20:25:12
您有一个类型为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的信息?
https://stackoverflow.com/questions/20611529
复制相似问题