opecv之边缘检测

68 阅读2分钟

file 如果你想通过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);
  1. image (InputArray image)
    • 作用:输入图像,必须是单通道的灰度图像。
    • 类型:InputArray,可以是 Mat 对象或其他支持的输入数组类型。
    • 示例:img_gry
  2. edges (OutputArray edges)
    • 作用:输出图像,即检测到的边缘图像。输出图像与输入图像具有相同的大小和类型。
    • 类型:OutputArray,可以是 Mat 对象或其他支持的输出数组类型。
    • 示例:img_can
  3. threshold1 (double threshold1)
    • 作用:第一个阈值,用于边缘连接。
    • 类型:double
    • 示例:10 解释:较低的阈值,用于边缘连接。如果一个像素的梯度值大于 threshold1,则被认为是强边缘。
  4. threshold2 (double threshold2)
    • 作用:第二个阈值,用于边缘检测。
    • 类型:double
    • 示例:10
    • 解释:较高的阈值,用于边缘检测。如果一个像素的梯度值大于 threshold2,则被认为是强边缘。如果一个像素的梯度值在 threshold1 和 threshold2 之间,则被认为是弱边缘,并根据其邻域中的强边缘进行连接。
  5. apertureSize (int apertureSize = 3)
    • 作用:Sobel 算子的孔径大小,必须是 3、5 或 7。
    • 类型:int
    • 默认值:3
    • 示例:3
    • 解释:Sobel 算子的孔径大小,用于计算图像的梯度。较大的孔径大小可以减少噪声,但会降低边缘检测的精度。
  6. L2gradient (bool L2gradient = false)
    • 作用:梯度幅值的计算方法。
    • 类型:bool
    • 默认值:false
    • 示例:true
    • 解释:
    • false:使用 L1 范数计算梯度幅值,即 |Gx| + |Gy|。
    • true:使用 L2 范数计算梯度幅值,即 sqrt(Gx^2 + Gy^2)。使用 L2 范数可以更准确地计算梯度幅值,但计算量稍大。

本文由博客一文多发平台 OpenWrite 发布!