《学习 OpenCV》第六章 214页练习 6

2762阅读 0评论2011-08-11 duanlin
分类:C/C++

6. 找到并载入一副正面人脸,眼睛是睁开的,并且占了图像的大部分区域。写代码找出眼睛的瞳孔。
  一个拉普拉斯算子“像”黑暗中的一个中心亮点。瞳孔正好相反,用一个足够大的拉普拉斯算子进行转换和卷积。
 
 
  1. int exes6()
  2. {
  3.     IplImage *img1,*img2;
  4.     cvNamedWindow("exes6_origin",CV_WINDOW_AUTOSIZE);
  5.     cvNamedWindow("exes6_laplace",CV_WINDOW_AUTOSIZE);
  6.     img1 = cvLoadImage("d:\\face4.jpg");
  7.     cvShowImage("exes6_origin",img1);

  8.     img2 = cvCreateImage(cvSize(img1->width,img1->height),IPL_DEPTH_32F,img1->nChannels);
  9.     cvLaplace(img1,img2,7);

  10.     cvShowImage("exes6_laplace",img2);

  11.     cvWaitKey(0);
  12.     return 0;
  13. }
cvLoadImage()一般都把图像加载为IPL_DEPTH_8U的形式。而且cvLaplace()函数有src和dst的格式要求。尤其是dst的色深要为IPL_DEPTH_16S或IPL_DEPTH_32F的形式。所以要为cvLaplace()的第二个参数预先安排好IPL_DEPTH_32F的图像存储空间,才能顺利进行下一步的cvLaplace()计算。
 
题目的目的是找出图像中的瞳孔,属于形状属性,所以图像的色彩数据会对识别有一定的干扰作用,于是升级代码,先将图像转变为灰度图像后再进行laplace变换。
  1. int exes6()
  2. {
  3.     const IplImage *img1;
  4.     IplImage *img2,*img3;
  5.     cvNamedWindow("exes6_origin",CV_WINDOW_AUTOSIZE);
  6.     cvNamedWindow("exes6_laplace",CV_WINDOW_AUTOSIZE);
  7.     img1 = cvLoadImage("d:\\face4.jpg");

  8.     img2 = cvCreateImage(cvSize(img1->width,img1->height),img1->depth,1);

  9.     cvCvtColor(img1,img2,CV_RGB2GRAY);
  10.     cvShowImage("exes6_origin",img2);

  11.     img3 = cvCreateImage(cvSize(img2->width,img2->height),IPL_DEPTH_32F,img2->nChannels);

  12.     cvLaplace(img2,img3,7);

  13.     cvShowImage("exes6_laplace",img3);

  14.     cvWaitKey(0);
  15.     return 0;
  16. }
结果图像效果:
上一篇:《学习 OpenCV》第六章 214页练习 4
下一篇:《学习 OpenCV》第六章 214页练习 7