【发布时间】:2013-06-07 02:52:12
【问题描述】:
我正在处理图像轮廓检测。我可以轻松打印轮廓坐标,但我有兴趣打印轮廓内所有像素的坐标。例如,如果我得到一个 4 x 4 像素的轮廓,那么我不仅要打印轮廓,还要打印它包含在 opencv 中的所有像素的坐标
【问题讨论】:
-
如何打印所有的轮廓像素很大程度上取决于你如何调用
findContours,所以你能粘贴你的代码来提取轮廓吗?
我正在处理图像轮廓检测。我可以轻松打印轮廓坐标,但我有兴趣打印轮廓内所有像素的坐标。例如,如果我得到一个 4 x 4 像素的轮廓,那么我不仅要打印轮廓,还要打印它包含在 opencv 中的所有像素的坐标
【问题讨论】:
findContours,所以你能粘贴你的代码来提取轮廓吗?
1- 使用 findContours 提取图像的轮廓。 (将您的图像转换为灰度,之前应用二进制阈值和精明边缘检测,以获得更好的结果。)
2- 选择轮廓(按面积、形状、矩等过滤)
3-对所有点使用pointPolygonTest,检查并保存它们是否在指定的轮廓内。
【讨论】:
我不确定您要做什么:
- 绘制填充轮廓
- 获取轮廓坐标和其中所有点
如果您只对绘图感兴趣,只需使用drawContour 函数并将参数thickness 设置为-1。它将绘制轮廓和其中的所有点。
我不确定在opencv中是否可以将所有点都放在某个轮廓内-您可以自己编写或仅绘制填充轮廓并从图像中获取所有非黑点(只需使用简单的循环)。这不是非常有效的解决方案,但应该可以正常工作。
【讨论】:
cv::FILLED(或python 中的cv2.FILLED)提供了更具可读性的代码...drawContours docs
简单的方法(假设没有直接执行此操作的 OpenCV 函数)是找到边界矩形,然后光栅扫描矩形以跟踪绕组数(如果不关心效率,则使用 pointPolygonTest)。
【讨论】:
轮廓是一组点。 例如在 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));
}
【讨论】: