4

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

4

4 回答 4

6

1- 使用 findContours 提取图像的轮廓。(将您的图像转换为灰度,之前应用二进制阈值和精明边缘检测,以获得更好的结果。)

2- 选择轮廓(按面积、形状、矩等过滤)

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

于 2013-06-20T14:43:46.887 回答
3

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

于 2013-06-07T10:24:09.377 回答
1

简单的方法(假设没有直接执行此操作的 OpenCV 函数)将是找到边界矩形,然后光栅扫描矩形以跟踪绕组数(或使用 pointPolygonTest 如果效率无关紧要)。

于 2013-06-07T04:52:07.250 回答
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));
}
于 2013-06-20T14:26:51.607 回答