我正在处理图像轮廓检测。我可以轻松地打印轮廓坐标,但我想打印轮廓内所有像素的坐标。例如,如果我得到一个 4 x 4 像素的轮廓,那么我希望不仅打印轮廓,还要打印 opencv 中它包含的所有像素的坐标。
1 - 使用findContours函数提取图像的轮廓。(为了获得更好的结果,请将图像转换为灰度图像,应用二值化阈值和Canny边缘检测。)
2 - 选择一个轮廓(根据面积、形状、矩等进行筛选)。
3 - 对所有点使用pointPolygonTest函数进行检查,并保存它们是否在指定轮廓内。
我不确定你想要做什么:
- 绘制填充轮廓
- 获取轮廓内所有点的坐标
如果你只对绘图感兴趣,可以使用drawContour
函数,并将参数thickness
设置为-1
。它会绘制轮廓和轮廓内的所有点。
我不确定在OpenCV中是否可能仅获取某些轮廓内的所有点 - 你可以自己编写代码或只是绘制填充轮廓,并从图像中获取所有非黑色点(只需使用简单的循环)。这不是非常有效的解决方案,但应该可以正常工作。
cv::FILLED
(或Python中的cv2.FILLED
)可以提供更易读的代码... drawContours文档 - Bonlenfum轮廓是一组点。例如在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));
}