利用openCV中的cvCanny函数检测人脸的边缘

前几天按照学校的要求做一个项目设计,指导老师让完成一个边缘检测的程序,用来提取出人脸的轮廓。于是将相关过程记录下来。
提取边缘,可以直接使用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日   西安交通大学


转载请注明出处。


你可能感兴趣的:(opencv,图像处理,边缘检测)