使用opencv跟踪边界

时间:2015-05-04 20:47:24

标签: c++ opencv image-processing computer-vision opencv3.0

我正在尝试从以下二进制图像中依次跟踪/跟踪边界点: enter image description here

我正在使用OpenCV(python)。我使用三种方式:

  1. 应用Canny边缘检测来检测边缘。问题是如何获得点序列?它的工作正常,但很难得到边界点序列
  2. 理想选择是检测二进制图像上的轮廓。因为轮廓按顺序返回边界点。但是openCV轮廓法没有检测到边界,如结果所示。为什么会这样?
  3. 检测Canny边缘的轮廓。还是有些边界错过了?
  4. enter image description here

    任何人都可以帮助我解决OpenCV轮廓的问题吗?为什么它没有跟踪完整的边界。我正在检测轮廓如下:

    contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)  

    其中thresh1是二进制图像

1 个答案:

答案 0 :(得分:1)

鉴于您的简单轮廓,我不确定您使用RETR_TREE的原因,因为没有嵌套轮廓。您是否尝试过使用RETR_EXTERNAL?

来自OpenCV docs:

  

CV_RETR_TREE检索所有轮廓并重建嵌套轮廓的完整层次结构。

     

CV_RETR_EXTERNAL仅检索极端外轮廓。

另外,请注意CHAIN_APPROX_SIMPLE将枚举边界上的所有点,它将尝试简化轮廓,特别是它不会返回多个连续的水平,垂直或对角点。如果您想要所有点,请使用CV_CHAIN_APPROX_NONE,这将强制轮廓算法找到所有边界点。

  

CV_CHAIN_APPROX_SIMPLE压缩水平,垂直和对角线段,只留下它们的终点。例如,右上方的矩形轮廓用4个点编码。

     

CV_CHAIN_APPROX_NONE绝对存储所有轮廓点。

以下代码适用于您的图片并找到132分:

<html>
<body>
    <h1>Your To-Do list</h1>
    <form method="POST">
        <input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
    </form>

    <table id="id_list_table">
        <tr><td>{{ new_item_text }}</td></tr>
    </table>
</body>
</html>

为CV_CHAIN_APPROX_NONE交换CV_CHAIN_APPROX_SIMPLE会导致一个轮廓返回737个点。

您没有包含代码的完整上下文,但请注意,findContours会修改源图像,因此如果您使用相同的源图像连续多次调用,则可能需要注意这一点。