当前位置: 首页 > 知识库问答 >
问题:

Opencv-椭圆轮廓未正确拟合

巫晋鹏
2023-03-14

我想在下面所附图像中显示的同心椭圆周围绘制轮廓。我没有得到预期的结果。

我尝试了以下步骤:

  1. 阅读图片

以下是源代码

import cv2

target=cv2.imread('./source image.png')

targetgs = cv2.cvtColor(target,cv2.COLOR_BGRA2GRAY)

targetGaussianBlurGreyScale=cv2.GaussianBlur(targetgs,(3,3),0)

canny=cv2.Canny(targetGaussianBlurGreyScale,30,90)


kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
close=cv2.morphologyEx(canny,cv2.MORPH_CLOSE,kernel)


_,contours,_=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
    for c in contours:
        if len(c) >= 50:
            hull=cv2.convexHull(c)
            cv2.ellipse(target,cv2.fitEllipse(hull),(0,255,0),2)

cv2.imshow('mask',target)
cv2.waitKey(0)
cv2.destroyAllWindows()

源图片:

共有1个答案

吕灿
2023-03-14

算法可以很简单:

>

  • 将RGB转换为HSV,拆分并使用V通道。

    删除所有颜色线的阈值。

    用于删除非颜色线的HoughLinesP。

    扩大侵蚀关闭椭圆孔。

    找到了一个椭圆。

    结果:

    https://imgs.xnip.cn/cj/n/96/df8f5eee-1018-406b-94ea-15de2653f89d.png" width="100%" height="100%" />

    对于新图像(添加黑色曲线),我的方法不起作用。似乎您需要使用Hough椭圆检测,而不是“findContours fitEllipse”。OpenCV没有实现,但您可以在此处或此处找到它。

    如果您不害怕C代码(因为OpenCV库C更具表现力),那么:

    cv::Mat rgbImg = cv::imread("sqOOE.jpg", cv::IMREAD_COLOR);
    
    cv::Mat hsvImg;
    cv::cvtColor(rgbImg, hsvImg, cv::COLOR_BGR2HSV);
    
    std::vector<cv::Mat> chans;
    cv::split(hsvImg, chans);
    cv::threshold(255 - chans[2], chans[2], 200, 255, cv::THRESH_BINARY);
    
    std::vector<cv::Vec4i> linesP;
    cv::HoughLinesP(chans[2], linesP, 1, CV_PI/180, 50, chans[2].rows / 4, 10);
    for (auto l : linesP)
    {
        cv::line(chans[2], cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar::all(0), 3, cv::LINE_AA);
    }
    cv::dilate(chans[2], chans[2], cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 4);
    cv::erode(chans[2], chans[2], cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 3);
    
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(chans[2], contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
    
    for (size_t i = 0; i < contours.size(); i++)
    {
        if (contours[i].size() > 4)
        {
            cv::ellipse(rgbImg, cv::fitEllipse(contours[i]), cv::Scalar(255, 0, 255), 2);
        }
    }
    
    cv::imshow("rgbImg", rgbImg);
    cv::waitKey(0);
    

  •  类似资料:
    • 主要内容:示例可以使用类的方法在图像上绘制椭圆形。 以下是这种方法的语法 - 该方法接受以下参数 - mat - 表示要在其上绘制矩形的图像的对象。 pt1 和 pt2 - 两个对象,表示要绘制的矩形的顶点。 color - 表示矩形颜色的标量对象(BGR)。 thickness - 表示矩形厚度的整数; 默认情况下,厚度值为。 类的构造函数接受类的对象,Size类的对象和double类型的变量,如下所示。 示

    • 目标 了解轮廓是什么。 学习查找轮廓,绘制轮廓等。 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。 为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。 从OpenCV 3.2开始

    • 我正在开发一个程序,提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于要删除任何非“方形”轮廓的位置。我想知道我怎么能做到这一点。 我所做的就是加载图像,使其变灰,模糊,精明的边缘检测,放大它,找到轮廓并绘制它们。 有没有一种方法可以让我在轮廓周围画出而不是填充它们?并删除周围大小不大致相同或几乎有90度角的轮廓? 这是初始图像: 以下是绘制轮廓的图像:

    • 我有一个边缘被坎尼探测到。我想提取边缘的轮廓。 我已经检查了下面的帖子。OpenCV转换Canny边缘到轮廓。 但是它没有处理复杂的形状。例如,带矩形的圆或带线的圆。 cv::findContours()函数有两个问题。1.返回非闭合边的闭合轮廓,但我需要非闭合轮廓2。为闭合边返回2个闭合轮廓(可能其中一个轮廓用于边,另一个用于边的内侧,但我想要两个轮廓中的一个。 有没有办法解决这个问题?谢谢。

    • 问题内容: 我想使用OpenCV 2.4.1软件包随附的Tutorial 2-Basic作为起点,使用Android版OpenCV检测椭圆。请注意,我的椭圆将是一个完美的photoshop之一。 据我了解,使用“ HoughCircles”只会找到完美的(或大约)圆,因此省略了椭圆。 任何帮助将不胜感激,因为我是OpenCV的初学者 到目前为止,这是我尝试过的 如果您认为更多信息可能有用,请告诉我

    • 我正在使用openCV检测图像中的矩形。在许多例子中,我使用阈值findContour约PolyDP。 如下图所示,我的问题是findContours找到的轮廓无法继续,因此在approxPolyDP之后,我无法获得矩形。。。 那么,你知道如何解决这个问题吗?谢谢你。:) 另一个问题:为什么轮廓是灰色的?在阈值之后,应该只有白色和黑色,不是吗? 轮廓 经批准