如果你想通过opencv的canny边缘检测将QQ图标的轮廓提取出来,那你阅读下面的代码即可:
#include <iostream>
#include"opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img_rgb, img_gry,img_can;
namedWindow("img_gry", WINDOW_AUTOSIZE);
namedWindow("img_can", WINDOW_AUTOSIZE);
//图片读取
Mat img = imread(argv[1], -1);//-1表示会按照原图显示,0表示灰度图,1表示彩色图,-1会保留alpha通道(透明度)
if (img.empty())
return -1;//错误处理
cvtColor(img, img_gry, COLOR_BGR2GRAY);
imshow("img_gry", img);
Canny(img_gry, img_can, 21000, 21000,7,true);//第一个阈值用于边缘连接,第二个阈值用于边缘检测,5表示sobel核大小,true表示使用使用 L2 范数
imshow("img_can", img_can);
waitKey(0);
destroyAllWindows();
return 0;
}
Canny(img_gry, img_can, 21000, 21000,7,true);
Canny(img_gry, img_can, 21000, 21000,7,true);
- image (InputArray image)
- 作用:输入图像,必须是单通道的灰度图像。
- 类型:InputArray,可以是 Mat 对象或其他支持的输入数组类型。
- 示例:img_gry
- edges (OutputArray edges)
- 作用:输出图像,即检测到的边缘图像。输出图像与输入图像具有相同的大小和类型。
- 类型:OutputArray,可以是 Mat 对象或其他支持的输出数组类型。
- 示例:img_can
- threshold1 (double threshold1)
- 作用:第一个阈值,用于边缘连接。
- 类型:double
- 示例:10 解释:较低的阈值,用于边缘连接。如果一个像素的梯度值大于 threshold1,则被认为是强边缘。
- threshold2 (double threshold2)
- 作用:第二个阈值,用于边缘检测。
- 类型:double
- 示例:10
- 解释:较高的阈值,用于边缘检测。如果一个像素的梯度值大于 threshold2,则被认为是强边缘。如果一个像素的梯度值在 threshold1 和 threshold2 之间,则被认为是弱边缘,并根据其邻域中的强边缘进行连接。
- apertureSize (int apertureSize = 3)
- 作用:Sobel 算子的孔径大小,必须是 3、5 或 7。
- 类型:int
- 默认值:3
- 示例:3
- 解释:Sobel 算子的孔径大小,用于计算图像的梯度。较大的孔径大小可以减少噪声,但会降低边缘检测的精度。
- L2gradient (bool L2gradient = false)
- 作用:梯度幅值的计算方法。
- 类型:bool
- 默认值:false
- 示例:true
- 解释:
- false:使用 L1 范数计算梯度幅值,即 |Gx| + |Gy|。
- true:使用 L2 范数计算梯度幅值,即 sqrt(Gx^2 + Gy^2)。使用 L2 范数可以更准确地计算梯度幅值,但计算量稍大。
本文由博客一文多发平台 OpenWrite 发布!