前几天按照学校的要求做一个项目设计,指导老师让完成一个边缘检测的程序,用来提取出人脸的轮廓。于是将相关过程记录下来。
提取边缘,可以直接使用cvCanny函数。
cvCanny是开放计算机视觉(OpenCV)库库函数之一,用于对图像的边缘检测(采用canny算法)。
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。edges 输出的边缘图像 ,也是单通道的,但是是黑白的threshold1 第一个阈值threshold2 第二个阈值aperture_size Sobel 算子内核大小函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
const char* filename = argc >= 2 ? argv[1] : "jobs.jpg";
IplImage* src = cvLoadImage( filename, 0 );
IplImage* dst;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
int i;
if( !src )
return -1;
dst = cvCreateImage( cvGetSize(src), 8, 1 );
//小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
cvCanny( src, dst, 50,200, 3 );
uchar *data_src;
uchar *data_dst;
data_src=(uchar *)src->imageData;
data_dst=(uchar *)dst->imageData;
for(int i=0;i<dst->height;i++)
{
for(int j=0;j<dst->width;j++)
{
if(data_dst[i*dst->widthStep+j*dst->nChannels]==(uchar)255)
data_src[i*src->widthStep+j*src->nChannels]=(uchar)255;
}
}
cvNamedWindow( "Source", 1 );
//cvShowImage( "Source", color_dst );
cvShowImage( "Source", src );
cvNamedWindow( "Hough", 1 );
cvShowImage( "Hough", dst );
cvWaitKey(0);
return 0;
}
实验结果如下图(右侧图像为用CVCanny得到的图像,左侧图像为将识别出的边缘标记到原图像上得到的图像)
关于此方面大家还有什么问题,欢迎留言指正,也欢迎用邮箱和我联系。
我的联系方式[email protected]
2015年3月17日 西安交通大学
转载请注明出处。