OpenCV的C++ Canny边缘检测

Og *_*dik 9 c++ opencv contour edge-detection

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

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 14

改变这一行

cvtColor( image, gray_image, CV_RGB2GRAY );
Run Code Online (Sandbox Code Playgroud)

至

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

问题似乎是你的灰度级手非常接近灰色背景.我已经在色调(颜色)上应用了Canny,因为肤色应该是充分不同的.

此外,Canny阈值看起来有点疯狂.公认的标准是较高的应该是较低的2倍至3倍.350有点太多了,它无助于解决主要问题.

编辑

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

CV :: Canny算子(图像,等高线,35,90);

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

但是,上面的改进会给你带来更好的结果(前提是你使用的阈值比10,350更好.试试(40,120))