为什么OpenCV的findContour方法不总是能找到封闭的外轮廓?

3

我有两张来自同一摄像机位置的图片。它们之间的区别在于一个是使用正交投影拍摄的,另一个是使用透视投影拍摄的。

这是两张图片:

Perspective and Orthographic sample images

当我在它们上面运行 findContour OpenCV 方法时,结果如下:

enter image description here

为什么 OpenCV 在透视图上找不到封闭的外轮廓曲线?

我尝试了 CV_RETR_TREE 和 CV_RETR_EXTERNAL 标志与 CV_CHAIN_APPROX_SIMPLE 和 CV_CHAIN_APPROX_NONE 标志的组合。

这是 文档示例代码(我正在使用)的 findContour 方法。

1个回答

3

实际上我无法重现你的问题。请尝试使用以下代码:

#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    RNG rng(1234);

    Mat3b img = imread("path_to_image");

    Mat1b gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    Mat1b bw = ~gray;

    vector<vector<Point>> contours;
    findContours(bw, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

    for (int i = 0; i < contours.size(); ++i)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(img, contours, i, color, 2);
    }

    imshow("Result", img);
    waitKey();

    return 0;
}

结果:

在此输入图片描述


(说明:该内容为一个html标签,其中包含一个指向图片的链接)

1
嗨Miki,非常感谢你的帮助。我尝试了你的代码,它起作用了。你的代码和我的区别在于,在调用findContour方法之前,我还模糊了图像。我想由于某种原因,这对轮廓检测没有帮助。 - Silex
4
你应该在二值化(黑白)图像上调用findContours函数。模糊处理会产生一些中间值,可能会干扰findContours的结果。 - Miki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接