OpenCV图像Canny边缘检测

Canny边缘检测

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

    void cvCanny(

      const CvArr* image,              //第一个参数表示输入图像,必须为单通道灰度图
      CvArr* edges,                      //第二个参数表示输出的边缘图像,为单通道黑白图
      double threshold1,
      double threshold2,               //第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,
                                                  大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为
                                                  是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个
                                                  点与高于上限值的像素点连接时我们才保留,否则删除。
      int aperture_size=3              //第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与
                                                  高斯拉普拉斯算子都是常用的边缘算子
    );
    
    函数功能:创建trackbar并添加到指定窗口

    函数原型:

    intcvCreateTrackbar(

        const char* trackbar_name,                     //第一个参数表示该trackbar的名称。
        const char* window_name,                      //第二个参数表示窗口名称,该trackbar将显示在这个窗口内。
        int* value,                                              //第三个参数表示创建时滑块的位置。
        int count,                                               //第四个参数表示滑块位置的最大值,最小值固定为0。
        CvTrackbarCallback on_change                 //第五个参数表示回调函数。当滑块位置有变化时,系统会调用该回调函数。
    );
    注:被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos()来获取
    trackbar显示的位置信息,以及通过函数cvSetTrackbarPos()来重新设置trackbar的显示位置。

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

    函数定义:
    typedef void (CV_CDECL *CvTrackbarCallback)(int pos)

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

#include "stdafx.h"
#include "iostream"
using namespace std;
#include "opencv2/opencv.hpp"
IplImage *pGrayImage = NULL;
IplImage *pCannyImage = NULL;

const char *pImagePath = "E:/C_VC_code/Text_Photo/girl001.jpg";
const char *pGrayWindowsTitle = "原图";
const char *pCannyWindowsTitle = "边缘检测图";
const char *pWindowsToolBarTitle = "阀值";
void onCallBack(int pos)
{
    //Canny check
    cvCanny(pGrayImage, pCannyImage, pos, pos*3, 3);
    cvShowImage(pCannyWindowsTitle, pCannyImage);
}
int main()
{
    //load gray image from srcouce file image
    pGrayImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_GRAYSCALE);
    pCannyImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U,1);

    //create window
    cvNamedWindow(pGrayWindowsTitle,CV_WINDOW_AUTOSIZE);
    cvNamedWindow(pCannyWindowsTitle,CV_WINDOW_AUTOSIZE);

    //creat slide bar
    int pos = 1;
    cvCreateTrackbar(pWindowsToolBarTitle, pCannyWindowsTitle, &pos, 100,onCallBack);
    onCallBack(0);

    cvShowImage(pGrayWindowsTitle,pGrayImage);
    cvShowImage(pCannyWindowsTitle,pCannyImage);

    cvWaitKey(0);
    cvDestroyWindow(pCannyWindowsTitle);
    cvDestroyWindow(pGrayWindowsTitle);
    cvReleaseImage(&pGrayImage);
    cvReleaseImage(&pCannyImage);
    return 0;
}

时间: 2024-10-14 07:30:43

OpenCV图像Canny边缘检测的相关文章

1、OpenCV图像的边缘检测

这里使用Canny函数进行边缘检测 函数定义: void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 ); 参数说明: image //输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改. edges //输出的边缘图像 ,也是单通道的,但是是黑白的 threshold1 //第一个阈值 threshold2 //

Canny边缘检测算法

作为对比,先看一下Sobel的原理: Sobel的原理: 索贝尔算子(Sobeloperator)是图像处理中的算子之一,主要用作边缘检测.在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值.在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量. 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值.如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像 Canny边缘检测算子的matlab实现 在以上例

OpenCV使用Canny边缘检测器实现图像边缘检测

纯粹阅读,请移步OpenCV使用Canny边缘检测器实现图像边缘检测 效果图 源码 KqwOpenCVFeaturesDemo Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化. Canny边缘检测器算法基本步骤 平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声. 计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直.水平和斜对角.这一步的输出用于在下一步中计算真正的边缘. 非最大值抑制:

Opencv对图像做边缘检测——canny算子

图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法.Canny 边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍,本文主要介绍如何在OpenCV中对图像进行Canny 边缘检测,下面就来看看这个函数的原型. 一. 主要函数 1.1 cvCanny 函数功能:采用Canny方法对图像进行边缘检测 函数原型:

六 OpenCV图像处理4 Canny 边缘检测

1.Canny 边缘检测原理 步骤: ·1噪声去除: 由于边缘检测很容易受到噪声影响,所以第一步是使用 5x5 的高斯滤波器 去除噪声 ·2计算图像梯度: 对平滑后的图像使用 Sobel 算子计算水平方向和竖直方向的一阶导数(图 像梯度)(Gx 和 Gy) 根据得到的这两幅梯度图(Gx 和 Gy)找到边界的梯 度和方向 梯度的方向一般总是与边界垂直.梯度方向被归为四类:垂直,水平,和 两个对角线. ·3非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非 边界上的点.对

openCV实例:Canny边缘检测

http://blog.sina.com.cn/s/blog_737adf530100z0jk.html 在第一次使用openCV程序成功对图像进行打开后,现在开始试验第二个例程试验:Canny边缘检测 这里算法原理和具体编程语句都先不管,因为作为一名新手(反正我是这么感觉的),拿些现成的程序跑出效果才是让人很有feel的. 先贴下原代码: #include "cv.hpp"#include "cxcore.hpp"#include "opencv2\hi

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

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

基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存

如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存为一个视频avi文件. 这里问题综合性比较大,这里进行分治. 该类问题可分为四个方面的处理: (1)打开 视频或者是摄像头,并播放视频 (2)对视频的每一帧做处理 (3)同窗体显示四个结果 (4)保存视频文件 以下分为这三个方面进行处理: (1)打开 视频或者摄像头,并播放视频 这个利用opencv

OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测

在笔记十四中,我们使用了Sobel算子对图像进行边缘检测,理论依据是像素变化最快的地方最有可能是边缘处,所以使用sobel算子对图像做微分,得到的结果图像当中灰度较大的区域,即为边缘处. 在这里,我们使用Laplace算子来做边缘检测,也是类似的道理,只不过换成了二阶微分,在一阶微分的极大值的地方,二阶微分为零.我们以二阶微分为零的区域作为边缘.当然了一阶微分极小值的地方,即图像变化很慢很慢的地方,二阶微分也可能为零.所以我们还需要进行额外的滤波. 在理论上是这样,但是在实现上,OpenCV使用