首页 > 解决方案 > Opencv从控制中删除轮廓(椭圆)

问题描述

我试图找到一个有类似问题的帖子,但没有运气。因此,作为我对 Opencv 来说或多或少的新手,我希望 smeone 可以在这里提供帮助。

我正在尝试从图像中检测“未填充”椭圆。由于图像背景在每一帧上都发生了变化,椭圆的大小和位置也在每一帧上发生了变化,我需要在每一帧上再次检测到它。

我遇到的问题是,在某些帧上出现了一些相似的颜色,它们不是椭圆的一部分,但由于它们的一些像素与椭圆的颜色范围相同,因此 cv::inRange 方法也在检测它们,这会导致一些大纲(见图)。

我正在使用这些点并生成它的凸包,因为我需要检查给定的 cv::Points 是否在椭圆内。但是如果有这些轮廓, cv::convexHull 当然会返回一个“破碎”的椭圆。

哪种方式可能是最好的,在每一帧上得到椭圆的点,创建一个正确的 cv::convexHull ?或者是否有另一种方法可以从图像中提取椭圆并使用它来检查给定的点是否在其中?

这是我当前获取省略号的代码:

    cv::Mat image ;
    cv::Mat3b img_hsv;
    cv::Mat1b imgBlackWhite;
    std::vector<cv::Point> result;
    std::vector<cv::Point> nonZeroPts;
    std::vector<std::vector<cv::Point> > contours;

while(true) {
    image = GetNextFrame();
    cv::cvtColor(image, img_hsv, cv::COLOR_BGR2HSV);
    
    inRange(img_hsv, cv::Scalar(90, 130, 255), cv::Scalar(91, 137, 255), imgBlackWhite);
    findNonZero(imgBlackWhite, nonZeroPts);

    if (nonZeroPts.size() == 0)
        return;

    cv::findContours(imgBlackWhite, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
    cv::convexHull(contours, result);
}

这显示了椭圆以及来自 cv::inRange 和 cv::findContours 的轮廓

在此处输入图像描述

预期结果:

在此处输入图像描述

希望有人能给我正确的提示。谢谢

标签: c++opencvimage-recognitioncolor-detection

解决方案


推荐阅读