6. 找到并载入一副正面人脸,眼睛是睁开的,并且占了图像的大部分区域。写代码找出眼睛的瞳孔。
一个拉普拉斯算子“像”黑暗中的一个中心亮点。瞳孔正好相反,用一个足够大的拉普拉斯算子进行转换和卷积。
- int exes6()
- {
- IplImage *img1,*img2;
- cvNamedWindow("exes6_origin",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("exes6_laplace",CV_WINDOW_AUTOSIZE);
- img1 = cvLoadImage("d:\\face4.jpg");
- cvShowImage("exes6_origin",img1);
- img2 = cvCreateImage(cvSize(img1->width,img1->height),IPL_DEPTH_32F,img1->nChannels);
- cvLaplace(img1,img2,7);
- cvShowImage("exes6_laplace",img2);
- cvWaitKey(0);
- return 0;
- }
cvLoadImage()一般都把图像加载为IPL_DEPTH_8U的形式。而且cvLaplace()函数有src和dst的格式要求。尤其是dst的色深要为IPL_DEPTH_16S或IPL_DEPTH_32F的形式。所以要为cvLaplace()的第二个参数预先安排好IPL_DEPTH_32F的图像存储空间,才能顺利进行下一步的cvLaplace()计算。
题目的目的是找出图像中的瞳孔,属于形状属性,所以图像的色彩数据会对识别有一定的干扰作用,于是升级代码,先将图像转变为灰度图像后再进行laplace变换。
- int exes6()
- {
- const IplImage *img1;
- IplImage *img2,*img3;
- cvNamedWindow("exes6_origin",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("exes6_laplace",CV_WINDOW_AUTOSIZE);
- img1 = cvLoadImage("d:\\face4.jpg");
- img2 = cvCreateImage(cvSize(img1->width,img1->height),img1->depth,1);
- cvCvtColor(img1,img2,CV_RGB2GRAY);
- cvShowImage("exes6_origin",img2);
- img3 = cvCreateImage(cvSize(img2->width,img2->height),IPL_DEPTH_32F,img2->nChannels);
- cvLaplace(img2,img3,7);
- cvShowImage("exes6_laplace",img3);
- cvWaitKey(0);
- return 0;
- }
结果图像效果:
阅读(1301) | 评论(0) | 转发(0) |