微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Opencv 从控制中删除轮廓线椭圆

如何解决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,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 的轮廓

enter image description here

预期结果:

enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。