C++下OpenCV的Canny边缘检测

9

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

这是由下面的代码生成的输出图像

#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);
}
1个回答

15

更改这一行

cvtColor( image, gray_image, CV_RGB2GRAY );
to
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(image,contours,35,90);

阅读一些关于算法的理论将有助于您了解发生了什么以及您应该如何改进。 在谷歌上搜索wiki canny

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接