我正在处理图像轮廓检测。我可以轻松打印轮廓坐标,但我有兴趣打印轮廓内所有像素的坐标。例如,如果我得到一个 4 x 4 像素的轮廓,那么我不仅要打印轮廓,还要打印它包含在 opencv 中的所有像素的坐标
问问题
15418 次
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 回答