c++ - 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 的轮廓
预期结果:
希望有人能给我正确的提示。谢谢
解决方案
推荐阅读
- javascript - 带有实时数据的 Vue 刷新页面
- scala - 使用另一个 DF 的列过滤 DF(两个 DF 中的列相同)Spark Scala
- powershell - 我无法解决“'System.OutOfMemoryException' 类型的异常”这个错误
- python - 将粗体文本写入文件
- google-cloud-platform - 谷歌云外壳,以便在注销时继续该过程
- javascript - 在 vuetify 的日历上不工作 prev()
- python - 从表中检索数据并将其注册为 Django 管理页面上的模型
- swift - Swift IOS 从 pod install 'FirebaseAnalytics' 中排除 google app mesurment 框架
- php - 静态页面的自动 Laravel 路由
- linux - 如何 ssh 进入在不同网络上运行的 docker 容器?