c++ - 使用opencv跟踪边界

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

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

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

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

enter image description here

任何人都可以帮助我了解 OpenCV 轮廓是怎么回事吗?为什么它没有跟踪完整的边界。我检测轮廓如下:

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

其中 thresh1 是二值图像

最佳答案

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

来自 OpenCV 文档:

CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours.

CV_RETR_EXTERNAL retrieves only the extreme outer contours.

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

CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal seg- ments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points.

CV_CHAIN_APPROX_NONE stores absolutely all the contour points.

以下代码适用于您的图像并找到 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 确实会修改源图像,因此如果您使用同一源图像连续进行多次调用,则可能需要注意这一点。

关于c++ - 使用opencv跟踪边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30039659/

相关文章:

c++ - 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离区复制到另一个隔离区?

c++ - 从单个客户端连接到多个服务器

c++ - 为什么 std::string 不可轻易破坏?

python - darkflow - 属性错误 : 'NoneType' object has no attribute 'find'

c++ - 如何用c/c++最方便的处理jpg图片?

c++ - 从不同线程调用对象的成员函数 : how to use mutex correctly?

c++ - 从图像中检测和提取人脸

c++ - OpenCV 人体追踪

c++ - Opencv - 释放内存将 cv::Mat refcount 更改为零

python - 测量金属零件孔径的图片,远心拍摄,单色相机用opencv