opencv入门指南第三篇canny边缘检测(代码片段)

heishanglaoyao heishanglaoyao     2023-02-01     771

关键词:

【OpenCV入门指南】第三篇Canny边缘检测

    图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。

    Canny边缘检测算子是John F. Canny 1986 年开发出来的一个多级边缘检测算法。Canny 边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍,本文主要介绍如何在OpenCV中对图像进行Canny 边缘检测,下面就来看看这个函数的原型。

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

 

 

一. 主要函数

1.1 cvCanny

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvCanny(

  const CvArr* image,

  CvArr* edges,

  double threshold1,double threshold2,

  int aperture_size=3

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。

第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。

 

为了更好的使用cvCanny()函数,下面再介绍二个实用的函数,这二个函数对后面的程序实现非常有帮助。

 

1.2 cvCreateTrackbar

函数功能:创建trackbar并添加到指定窗口

函数原型:

intcvCreateTrackbar(

  const char* trackbar_name,

  const char* window_name,

  int* value,

  intcount,

  CvTrackbarCallback on_change

);

函数说明:

第一个参数表示该trackbar的名称。

第二个参数表示窗口名称,该trackbar将显示在这个窗口内。

第三个参数表示创建时滑块的位置。

第四个参数表示滑块位置的最大值,最小值固定为0

第五个参数表示回调函数。当滑块位置有变化时,系统会调用该回调函数。

注:被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos()来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos()来重新设置trackbar的显示位置。

 

1.3  CvTrackbarCallback

函数功能:cvCreateTrackbar()函数所使用的回调函数

函数定义:

typedef void (CV_CDECL *CvTrackbarCallback)(int pos)

函数说明:

trackbar位置被改变的时,系统会调用这个回调函数,并将参数pos设置为表示trackbar位置的数值。

 

二. 示例程序代码

下面就给出在OpenCV中使用Canny 边缘检测的程序代码:

//图像的Canny边缘检测
//By MoreWindows (http://blog.csdn.net/MoreWindows)
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:"windows" /entry:"mainCRTStartup"")
IplImage *g_pSrcImage, *g_pCannyImg;
const char *pstrWindowsCannyTitle = "边缘检测图(http://blog.csdn.net/MoreWindows)";
//cvCreateTrackbar的回调函数
void on_trackbar(int threshold)

	//canny边缘检测
	cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);
	cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);

int main()

	const char *pstrImageName = "001.jpg";
	const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";
	const char *pstrWindowsToolBar = "Threshold";

	//从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图
	g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
	g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);

	//创建窗口
	cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
	cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);

//创建滑动条
	int nThresholdEdge = 1;
	cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 100, on_trackbar);

	//在指定窗口中显示图像
	cvShowImage(pstrWindowsSrcTitle, g_pSrcImage);
	on_trackbar(1);

	//等待按键事件
	cvWaitKey();

	cvDestroyWindow(pstrWindowsSrcTitle);
	cvDestroyWindow(pstrWindowsCannyTitle);
	cvReleaseImage(&g_pSrcImage);
	cvReleaseImage(&g_pCannyImg);
	return 0;

运行效果如图所示:

技术分享图片

 

本篇介绍了Canny边缘检测,这种方法能有效的找出图像中的所有边缘。后面将还有文章介绍在OpenCV中对图像进行轮廓检测,欢迎继续浏览。在对图像进行轮廓检测前必须要先对图像进行二值化,因此请先看《OpenCV入门指南】第四篇图像的二值化

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8239625

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net


opencv轮廓检测(代码片段)

《【OpenCV入门指南】第三篇Canny边缘检测》中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点。那么就可以将中间的那一点去掉。    在OpenCV中使用轮廓检... 查看详情

opencv检测图像边缘canny算法应用(代码片段)

图解边缘检测opencv应用Canny算法进行边缘检测importcv2ascvimportnumpyasnpimg=cv.imread(‘baby_g.jpg‘,0)#二值化图像处理后,边缘检测效果更好_,thresh=cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)#canny边缘检测,60以下置为0,180以上置为255,第2、3... 查看详情

opencv——canny边缘检测(代码片段)

目录一、Canny算法二、C++代码三、python代码四、结果展示1、原始图像2、灰度图像3、图像边缘五、参考链接一、Canny算法  Canny边缘检测算法是目前最优越的边缘检测算法之一,该算法的检测过程分5个步骤:使用... 查看详情

opencv入门项目——车道线检测(代码片段)

文章目录Canny边缘检测小程序roi_mask理论实现霍夫变换基本原理API实现离群值过滤最小二乘拟合API实现直线绘制API视频流读写API实现Canny边缘检测importcv2img=cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)edge_img=cv2.Canny(img,50,100)cv2.imshow... 查看详情

opencv入门之九opencv边缘检测:canny算子,sobel算子,laplace算子,scharr滤波器

参考网站:http://blog.csdn.net/poem_qianmo/article/details/25560901 1、边缘检测步骤  1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感。(通常用高斯滤波)  2)增强:增强边缘的基础是... 查看详情

opencv中的图像处理——图像梯度+canny边缘检测+图像金字塔(代码片段)

OpenCV中的图像处理——图像梯度+Canny边缘检测+图像金字塔目录OpenCV中的图像处理——图像梯度+Canny边缘检测+图像金字塔1.图像梯度1.1Sobel和Scharr算子1.2Laplacian算子2.Canny边缘检测2.1多阶段的Canny边缘检测算法2.2OpenCV中... 查看详情

openCV Canny 边缘检测改进

】openCVCanny边缘检测改进【英文标题】:openCVCannyedgedetectionimprovement【发布时间】:2019-11-1323:49:20【问题描述】:我正在尝试在我的python代码中使用openCVCanny边缘检测器。我想沿着对象的边缘进行边缘检测,对应于皮肤。我做到了... 查看详情

实战深度学习opencv:canny边缘检测(代码片段)

利用canny边缘检测,我们可以很好地得到哦一个图像的轮廓,下面是基于C++的,这是我们通过这段代码得到的结果:#include"pch.h"#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgpr 查看详情

opencv学习代码记录——canny边缘检测

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest。#include<opencv2/core/core.hpp>#include<opencv2/highgui/h... 查看详情

opencv之canny边缘检测器(代码片段)

python代码:importcv2ascvimportnumpyasnpsrc=cv.imread("./test.png")cv.namedWindow("input",cv.WINDOW_AUTOSIZE)cv.imshow("input",src)#t1=100,t2=3*t1=300edge=cv.Canny(src,100,300)cv.imshow("maskimage",edge) 查看详情

opencv之canny边缘检测器(代码片段)

python代码:importcv2ascvimportnumpyasnpsrc=cv.imread("./test.png")cv.namedWindow("input",cv.WINDOW_AUTOSIZE)cv.imshow("input",src)#t1=100,t2=3*t1=300edge=cv.Canny(src,100,300)cv.imshow("maskimage",edge) 查看详情

python图像边缘检测|利用opencv和skimage的canny算法(代码片段)

文章目录一、简介二、opencv实践三、skimage实践CSDN叶庭云:https://yetingyun.blog.csdn.net/一、简介提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算法... 查看详情

使用 OpenCV (Canny) 进行边缘检测

】使用OpenCV(Canny)进行边缘检测【英文标题】:EdgedetectionusingOpenCV(Canny)【发布时间】:2014-06-1200:45:37【问题描述】:我正在尝试使用OpenCV检测矩形。然而,有时这在运行Canny方法后变得相当困难,因为通常会擦除两个边缘。在应... 查看详情

opencv-canny边缘检测(代码片段)

作者:翟天保Steven版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处函数原型voidCanny(InputArrayimage,OutputArrayedges,doublethreshold1,doublethreshold2,intapertureSize=3,boolL2gradient= 查看详情

opencv-canny边缘检测(代码片段)

作者:翟天保Steven版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处函数原型voidCanny(InputArrayimage,OutputArrayedges,doublethreshold1,doublethreshold2,intapertureSize=3,boolL2gradient= 查看详情

opencv中canny边缘检测和霍夫变换的讲解与实战应用(附python源码)(代码片段)

...找图像边缘,最终可以绘制十分精细的二值边缘图像opencv将canny边缘检测算法封装在canny方法中语法如下edges=cv2.Canny(image,threshold1,threshold2,apertureSize,L2gradient)image检测的原始图像threshold1计算过程中使用的第一个阈值通... 查看详情

opencv--边缘检测(代码片段)

Canny边缘检测使用高斯滤波器,以平滑图像,滤除噪声计算图像中每个像素点的梯度强度和方向应用非极大值(Non-MaximumSuppression)抑制,以消除边缘检测带来的杂散响应应用双阈值(Double-Threshold)检测来确定真实的和潜在的边... 查看详情

OpenCV:Canny 边缘检测器获取 minEnclosureCircle

】OpenCV:Canny边缘检测器获取minEnclosureCircle【英文标题】:OpenCV:CannyedgedetectorgetminEnclosingCircle【发布时间】:2019-05-1319:55:04【问题描述】:我正在使用Canny边缘检测器检测白色背景上的对象,并想在其周围绘制一个矩形和一个圆... 查看详情