Chinaunix首页 | 论坛 | 博客
  • 博客访问: 301966
  • 博文数量: 32
  • 博客积分: 665
  • 博客等级: 上士
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-25 11:20
文章分类

全部博文(32)

文章存档

2023年(1)

2021年(1)

2020年(2)

2018年(3)

2014年(1)

2013年(2)

2012年(9)

2011年(9)

2010年(2)

2009年(2)

分类: C/C++

2011-08-11 17:13:12

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. }
结果图像效果:
阅读(2722) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~