将图片设置为标准252*312的证件照

      最近刚刚接触opencv,里面的函数库太丰富了,想到前段时间班上群里说把照片都设置为:252*312的证件电子照后,决定用opencv的cvReSize来实现这个:

      其实原理很简单,就是一个线性的重采样,代码也比较少,大家看吧:

View Code
 1 #include "highgui.h"  
2 #include "cv.h"
3
4 void unionImageSize(IplImage *src,IplImage **dst)
5 {
6 *dst=cvCreateImage(cvSize(252,312),src->depth,src->nChannels);
7 cvResize(src,*dst,CV_INTER_LINEAR);
8
9 cvSaveImage("D:\\out_image.jpg",*dst);
10 }
11
12 int main(int argc,char ** argv)
13 {
14 IplImage * src = cvLoadImage("D:\\SIFTTest_image\\image.jpg");
15 IplImage * dst=NULL;
16
17 unionImageSize(src,&dst);
18
19 cvSaveImage("D:\\out_image1.jpg",dst);
20
21 cvNamedWindow("source",CV_WINDOW_AUTOSIZE);
22 cvShowImage("source",src);
23
24 cvNamedWindow("outimage",CV_WINDOW_AUTOSIZE);
25 cvShowImage("outimage",dst);
26
27 cvWaitKey(0);
28 cvReleaseImage(&src);
29 cvReleaseImage(&dst);
30
31 cvDestroyAllWindows();
32 return 0;
33 }


      函数unionImageSize是在一个师兄的指导下完成的,之前对c++的东西接触的比较少,没有太多的考虑,直接就用void unionImageSize(IplImage *src,IplImage *dst)来想改变指针dst中所存的图片,但是没有成功,后面在高手的指导下才发现dst传进去不过是一个指针变量,在函数执行时会复制一个副本,这个副本指向的是dst所指的图片存储地址,但是这个指针变量仅仅是一个变量,在函数之行完之后,并没有改变指针dst所指的地址。

     这时应该用指向指针的指针,也就是&dst,相应的unionImageSize函数也应该改成void unionImageSize(IplImage *src,IplImage **dst),变量IplImage **dst就是指向指针的指针,函数unionImageSize执行时,改变的就是dst所指向的地址了,而不仅仅是dst这个副本变量。

  有说的不对的地方请大家指出,谢谢了!

posted @ 2011-10-12 20:27  ll2008  阅读(4571)  评论(0编辑  收藏  举报