0

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

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

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

在此处输入图像描述

谁能帮我OpenCV轮廓发生了什么?为什么它不跟踪完整的边界。我正在检测轮廓如下:

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

其中 thresh1 是二值图像

4

1 回答 1

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 确实会修改源图像,因此如果您使用相同的源图像连续进行多次调用,这可能需要注意。

于 2015-05-06T00:46:05.120 回答