OpenCV在C++中的精明边缘检测

OpenCV's Canny Edge Detection in C++

本文关键字:边缘检测 C++ OpenCV      更新时间:2023-10-16

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

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

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

更改此行

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