我想提取手的边缘,但我得到以下结果。我已经尝试调整低和高阈值,但我仍然无法获得所需的输出。我在下面列出了代码及其输出。什么似乎是问题?
这是以下代码生成的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);
}
答案 0 :(得分:14)
更改此行
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 ::坎尼(图像,等高线,35,90);
阅读有关该算法的一些理论将有助于您了解发生了什么以及应该采取哪些措施来改进。谷歌上的wiki canny
但是,上面的改进会给你带来更好的效果(前提是你使用的阈值超过10,350。尝试(40,120))