OpenCV在C++中的精明边缘检测
OpenCV's Canny Edge Detection in C++
我想提取手的边缘,但我得到以下结果。我尝试调整低阈值和高阈值,但仍然无法获得所需的输出。我在下面包含了代码及其输出。似乎有什么问题?
这是由以下代码生成的输出图像。
#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) )
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- SFML C++ Canny边缘检测双刃
- 彩色图像的边缘检测 CannyAlgorithm.
- ffmpeg/opencv 如何在分类后执行边缘检测 帧的类型
- 使用计算机视觉进行产品检测-使用opencv进行边缘检测
- 精明的边缘检测
- C 中视频的OpenCV Canny边缘检测
- 利用mpi进行sobel边缘检测
- 边缘检测-检测错误
- OpenCV在C++中的精明边缘检测
- 我需要修改 Sobel 内核以进行对角线边缘检测.OpenCV和C++
- Sobel 边缘检测错误(OpenCV 错误:断言失败 (DIMS<=2&&Data&&(无符号)i0)
- 获得最大的结构(Canny边缘检测)
- 图形中的拐角和边缘检测
- 边缘检测opencv android
- 如何在iOS中使用Opencv检测嘴唇边缘
- 卡边缘检测OpenCV