图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。
采用Canny方法对图像进行边缘检测
函数原型:
voidcvCanny(
constCvArr* image,
CvArr* edges,
doublethreshold1,doublethreshold2,
intaperture_size=3
);
函数说明:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子
#include "stdafx.h"
#include <opencv.hpp>
#include <cxcore.h>
#include <highgui.h>
#include <stdio.h>
int main()
{
IplImage *ImageInfo = cvLoadImage("1.jpg");//读取图像
unsigned short mWide = ImageInfo->width;
unsigned short mHeight = ImageInfo->height;
unsigned char *ImageData = (unsigned char*)ImageInfo->imageData;
unsigned char nChannel = ImageInfo->nChannels;
//double fscale=0.314;//缩放系数
// int SmallWide =mWide*fscale;//缩放后的宽度
//int SmallHeight=mHeight*fscale;//缩放后的高度
IplImage *GrayImage = cvCreateImage(cvSize(mWide,mHeight),8,1);//新建图像函数
//IplImage *SmallImage = cvCreateImage(cvSize(SmallWide,SmallHeight),8,3);//新建缩放图像函数
IplImage *BinaryImage = cvCreateImage(cvSize(mWide,mHeight),8,1);//新建二值化图像函数
IplImage *CannyImage = cvCreateImage(cvSize(mWide,mHeight),8,1);//新建Canny检测图像函数
cvCvtColor(ImageInfo,GrayImage,CV_RGB2GRAY);//将彩色图像改为灰度图像
//cvResize(ImageInfo,SmallImage,CV_INTER_AREA);//将图像缩放
//cvThreshold(GrayImage,BinaryImage,180,255,CV_THRESH_BINARY);//转为二值图
cvCanny(GrayImage,CannyImage,100,200,3);//进行边缘检测
//printf("mWide = %d\r\n mHeight = %d\r\n nChannel = %d\r\n SmallWide=%d\r\n SmallHeight=%d\r\n",mWide,mHeight,nChannel,SmallWide,SmallHeight);
cvNamedWindow("the Image of show:");//创建窗口函数
cvShowImage("the Image of show:",ImageInfo);//显示函数
cvNamedWindow("the GrayImage of show:");//创建窗口函数
cvShowImage("the GrayImage of show:",GrayImage);//显示函数
//cvNamedWindow("缩放图:");//创建窗口函数
//cvShowImage("缩放图:",SmallImage);//显示函数
//cvNamedWindow("二值图:");//创建窗口函数
//cvShowImage("二值图:",BinaryImage);//显示函数
cvNamedWindow("边缘检测:");//创建窗口函数
cvShowImage("边缘检测:",CannyImage);//显示函数
cvWaitKey(-2);//等待按键事件
return 0;
}
为了可以调节阈值,使用一个新函数:如下
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的显示位置。
函数功能:cvCreateTrackbar()函数所使用的回调函数
函数定义:
typedef void (CV_CDECL *CvTrackbarCallback)(int pos)
函数说明:
当trackbar位置被改变的时,系统会调用这个回调函数,并将参数pos设置为表示trackbar位置的数值。