【问题标题】:OpenCV's Canny Edge Detection in C++C++ 中 OpenCV 的 Canny 边缘检测
【发布时间】:2012-08-12 19:42:51
【问题描述】:

我想提取手的边缘,但得到以下结果。我已经尝试调整低阈值和高阈值,但仍然无法获得所需的输出。我在下面包含了代码及其输出。似乎是什么问题?

这是下面代码生成的output image

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main(){

    cv::Mat image= cv::imread("open_1a.jpg");
    cv::Mat contours;
    cv::Mat gray_image;

    cvtColor( image, gray_image, CV_RGB2GRAY );

    cv::Canny(image,contours,10,350);

    cv::namedWindow("Image");
    cv::imshow("Image",image);

    cv::namedWindow("Gray");
    cv::imshow("Gray",gray_image);

    cv::namedWindow("Canny");
    cv::imshow("Canny",contours);
    cv::waitKey(0);
}

【问题讨论】:

    标签: c++ opencv contour edge-detection


    【解决方案1】:

    改变这一行

    cvtColor( image, gray_image, CV_RGB2GRAY );
    

    std::vector<cv::Mat> channels;
    cv::Mat hsv;
    cv::cvtColor( image, hsv, CV_RGB2HSV );
    cv::split(hsv, channels);
    gray_image = channels[0];
    

    问题似乎是您的灰度手非常接近灰色背景。我在色调(颜色)上应用了 Canny,因为肤色应该足够不同。

    此外,Canny 阈值看起来有点疯狂。公认的规范是,较高的应该是较低的 2 到 3 倍。 350有点多,无助于解决主要问题。

    编辑

    通过这些阈值,我能够提取出相当不错的轮廓

    cv::Canny(图像,轮廓,35,90);

    阅读一些有关该算法的理论将帮助您了解发生了什么以及应该做些什么来改进。谷歌上的wiki canny

    但是,上述改进会给您带来更好的结果(前提是您使用比 10、350 更好的阈值。尝试 (40, 120))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多