OpenCV Fitellipse绘制错误的轮廓

时间:2019-02-12 06:34:31

标签: python-3.x numpy opencv computer-vision cv2

我想在下面的给定图形周围绘制椭圆轮廓​​。由于该图由两行组成,因此我没有得到正确的结果。

我尝试了以下操作:-

  1. 阅读图像
  2. 将BGR转换为HSV
  3. 定义蓝色的范围
  4. 创建inRange遮罩以捕获上下蓝之间的值
  5. 找到轮廓并绘制适合的椭圆。

这是源代码-

!

下图/图像显示了预期和实际输出-

Expected & Actual display image

源图像 Source Image

输出轮廓数组 Contour file

1 个答案:

答案 0 :(得分:-1)

我尝试在C ++上运行您的代码,并为结果轮廓添加腐蚀,膨胀和凸面壳:

auto DetectEllipse = [](cv::Mat rgbImg, cv::Mat hsvImg, cv::Scalar fromColor, cv::Scalar toColor)
{
    cv::Mat threshImg;
    cv::inRange(hsvImg, fromColor, toColor, threshImg);
    cv::erode(threshImg, threshImg, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 2);
    cv::dilate(threshImg, threshImg, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)), cv::Point(-1, -1), 2);

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(threshImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

    int areaThreshold = (rgbImg.cols * rgbImg.rows) / 100;

    std::vector<cv::Point> allContours;
    allContours.reserve(10 * areaThreshold);

    for (size_t i = 0; i < contours.size(); i++)
    {
        if (contours[i].size() > 4)
        {
            auto area = cv::contourArea(contours[i]);
            if (area > areaThreshold)
            {
                allContours.insert(allContours.end(), contours[i].begin(), contours[i].end());
            }
        }
    }
    if (allContours.size() > 4)
    {
        std::vector<cv::Point> hull;
        cv::convexHull(allContours, hull, false);

        cv::ellipse(rgbImg, cv::fitEllipse(hull), cv::Scalar(255, 0, 255), 2);
    }
};

cv::Mat rgbImg = cv::imread("h8gx3.jpg", cv::IMREAD_COLOR);
cv::Mat hsvImg;
cv::cvtColor(rgbImg, hsvImg, cv::COLOR_BGR2HSV);

DetectEllipse(rgbImg, hsvImg, cv::Scalar(75, 0, 0), cv::Scalar(105, 255, 255));
DetectEllipse(rgbImg, hsvImg, cv::Scalar(10, 100, 20), cv::Scalar(25, 255, 255));

cv::imshow("rgbImg", rgbImg);
cv::waitKey(0);

结果看起来正确: enter image description here