【问题标题】:tracking boundary using opencv使用opencv跟踪边界
【发布时间】:2015-07-14 09:37:49
【问题描述】:

我正在尝试从以下二进制图像中按顺序跟踪/跟踪边界点:

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

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

谁能帮我看看 OpenCV 轮廓是怎么回事?为什么它不跟踪完整的边界。我检测轮廓如下:

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

其中 thresh1 是二值图像

【问题讨论】:

  • 在结果图中,第一张显示边缘检测,第二张显示在边缘检测到的轮廓,第三张显示直接在二值图像上检测到的轮廓
  • 注释 406pts、262pts 和 1062pts 表示什么,这些数字从何而来?它们是 findContours 中轮廓的大小吗?如果是这样,看起来您检测到了很多,但第三张图像可能渲染得不好。你能更详细地解释你想要得到什么吗?是边界中的所有点吗?您将如何将这些映射到下一帧的边界?
  • pts 表示白色像素或边界点的数量.. 我正在尝试检测二进制对象的边界并从上到下依次获取所有边界点的列表.. . 由于某种原因,轮廓检测在二进制对象上根本失败......轮廓检测按顺序返回边界点。边缘检测效果很好,但它不会按顺序返回边界点

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


【解决方案1】:

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

来自 OpenCV 文档:

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

CV_RETR_EXTERNAL 仅检索极端外轮廓。

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

CV_CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线段,只留下它们的端点。例如,一个直立的矩形轮廓用 4 个点进行编码。

CV_CHAIN_APPROX_NONE 绝对存储所有轮廓点。

以下代码适用于您的图像并找到 132 个点:

// Load original image as grey scale
Mat image = imread("imagename.png", IMREAD_GRAYSCALE);

vector<vector<Point>> contours;
Mat hierarchy;
findContours(image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

将 CV_CHAIN_APPROX_SIMPLE 替换为 CV_CHAIN_APPROX_NONE 会导致返回一个包含 737 个点的轮廓。

您尚未包含代码的完整上下文,但请注意 findContours 确实会修改源图像,因此如果您使用相同的源图像连续进行多次调用,这可能需要注意。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2018-08-24
    • 2023-03-07
    • 2017-01-26
    • 2011-06-21
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多