【问题标题】:How to print all coordinates inside the Contour opencv如何在 Contour opencv 中打印所有坐标
【发布时间】:2013-06-07 02:52:12
【问题描述】:

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

【问题讨论】:

  • 如何打印所有的轮廓像素很大程度上取决于你如何调用findContours,所以你能粘贴你的代码来提取轮廓吗?

标签: opencv contour


【解决方案1】:

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

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

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

【讨论】:

  • 对于大小为 2500x2000 的图像,我将对 pointPolygonTest 进行 500 万次调用以获取大小为 10 的轮廓?我建议至少计算轮廓的边界框,然后只在这个框内测试点。
【解决方案2】:

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

【讨论】:

  • 为了完整起见,由于厚度=-1 并不是特别不言自明,标志cv::FILLED(或python 中的cv2.FILLED)提供了更具可读性的代码...drawContours docs
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    轮廓是一组点。 例如在 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));
    }
    

    【讨论】:

    • 这不是在轮廓内部,这只是绘制轮廓本身,即边缘。
    • 这正是我所需要的,谢谢 Tomasz! :)
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多