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);
}
4

1 回答 1

15

更改此行

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) )

于 2012-08-16T13:34:29.463 回答