如何在OpenCV中打印所有轮廓内的坐标

4

我正在处理图像轮廓检测。我可以轻松地打印轮廓坐标,但我想打印轮廓内所有像素的坐标。例如,如果我得到一个 4 x 4 像素的轮廓,那么我希望不仅打印轮廓,还要打印 opencv 中它包含的所有像素的坐标。


1
如何打印所有轮廓像素主要取决于您如何调用“findContours”,所以您能否粘贴提取轮廓的代码? - cxyzs7
4个回答

6

1 - 使用findContours函数提取图像的轮廓。(为了获得更好的结果,请将图像转换为灰度图像,应用二值化阈值和Canny边缘检测。)

2 - 选择一个轮廓(根据面积、形状、矩等进行筛选)。

3 - 对所有点使用pointPolygonTest函数进行检查,并保存它们是否在指定轮廓内。


13
我会尝试为您翻译以下内容:使用大小为2500x2000的图像,我将对大小为10的轮廓进行500万次pointPolygonTest调用?我建议至少计算轮廓的边界框,然后仅测试在此框内部的点。 - sluki

3

我不确定你想要做什么:
- 绘制填充轮廓
- 获取轮廓内所有点的坐标
如果你只对绘图感兴趣,可以使用drawContour函数,并将参数thickness设置为-1。它会绘制轮廓和轮廓内的所有点。
我不确定在OpenCV中是否可能仅获取某些轮廓内的所有点 - 你可以自己编写代码或只是绘制填充轮廓,并从图像中获取所有非黑色点(只需使用简单的循环)。这不是非常有效的解决方案,但应该可以正常工作。


1
请注意,由于thickness=-1并不特别自解释,因此标志cv::FILLED(或Python中的cv2.FILLED)可以提供更易读的代码... drawContours文档 - Bonlenfum

1
简单的方法(假设没有OpenCV函数可以直接完成)是找到边界矩形,然后对矩形进行光栅扫描,同时跟踪绕数(如果效率不重要,则可以使用pointPolygonTest)。

0

轮廓是一组点。例如在C++中(在Java和Python中也类似),轮廓存储在向量中:

vector<vector<cv::Point>>

例如,如果您正在以此方式查找轮廓:

vector<vector<cv::Point>> contours1;
cv::findContours( input_img, contours1, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE );

您可以进入轮廓的每个点。 这是绘制特定轮廓点的代码示例。

cv::Mat draw = cv::Mat::zeros( 500,500, CV_8UC3 );

int contour_id = 1;

for(int i = 0; i< contour[contour_id].size(); i++)
{
    cout << contour[contour_id][i] << endl; 
    // Now draw every point as a circle with radius = 1

    cv::circle(draw,contour[contour_id][i],1,cv::Scalar(0,0,255));
}

3
这不是在轮廓线里面,它只是勾勒轮廓线本身,也就是边缘。 - David
这正是我所需要的,谢谢Tomasz! :) - Felipe Valdes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接