opencv复杂变换cvPyrDown [6]

送上新鲜的热腾腾的程序:

 1 #include <highgui.h>
 2 #include <cv.h>
 3 
 4 IplImage * doPryDown(IplImage * in,int filter=CV_GAUSSIAN_5x5)
 5 {
 6     //assert(in->width%2==0 && in->height%2==0);
 7     IplImage * out=cvCreateImage(cvSize(in->width/2,in->height/2),in->depth,in->nChannels);
 8     cvPyrDown(in,out,CV_GAUSSIAN_5x5);//filter=7 目前只支持CV_GAUSSIAN_5x5
 9     return (out);
10 }
11 int main()
12 {
13     cvNamedWindow("example-in");
14     cvNamedWindow("example-out");
15     IplImage * in= cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\airplane.png");
16     cvShowImage("example-in",in);
17     IplImage * out = doPryDown(in);
18     cvShowImage("example-out",out);
19 
20     cvWaitKey(0);//key point
21     cvReleaseImage(&in);
22     cvReleaseImage(&out);
23     cvDestroyWindow("example-in");    
24     cvDestroyWindow("example-out");
25 }

cvPyrDown
  cvPyrDown为openCV中的一个函数。
  功能:
    函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。对图像进行缩放处理。
  格式:
    void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
  参数:
    src 输入图像。
    dst 输出图像,其宽度和高度应是输入图像的一半。
    filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。

如果是连续进行的缩放变换呢?

我们看下面的程序:

 1 #include <highgui.h>
 2 #include <cv.h>
 3 
 4 IplImage * doCanny(IplImage * in,double lowThresh,double highThresh,double aperture)
 5 {
 6     if(in->nChannels !=1)
 7     {
 8         return 0;
 9     }
10     IplImage *out =cvCreateImage(cvSize(cvGetSize(in).width,cvGetSize(in).height),IPL_DEPTH_8U,1);
11     cvCanny(in,out,lowThresh,highThresh,aperture);
12     return (out);
13 
14 }
15 IplImage * doPryDown(IplImage * in,int filter=CV_GAUSSIAN_5x5)
16 {
17     //assert(in->width%2==0 && in->height%2==0);
18     int width =(int) in->width/2;
19     int height = (int) in->height/2;
20     IplImage * out=cvCreateImage(cvSize(width,height),in->depth,in->nChannels);
21     cvPyrDown(in,out,CV_GAUSSIAN_5x5);//filter=7 目前只支持CV_GAUSSIAN_5x5
22     return (out);
23 }
24 int main()
25 {
26     cvNamedWindow("example-in");
27     cvNamedWindow("example-out");
28     IplImage * in=cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\rice.png",0);
29     cvShowImage("example-in",in);
30     IplImage * out=NULL;
31     //做两次连续的缩放变换和边缘检测
32     out = doPryDown(in,CV_GAUSSIAN_5x5);
33     out = doPryDown(in,CV_GAUSSIAN_5x5);
34     out = doCanny(in,1.0,3.0,3);
35 
36     cvShowImage("example-out",out);
37 
38     cvWaitKey(0);//key point
39     cvReleaseImage(&in);
40     cvReleaseImage(&out);
41     cvDestroyWindow("example-in");    
42     cvDestroyWindow("example-out");
43 }

  在opencv中,我们必须确认被释放的空间必须是我们显示分配的。

  如果进行“自清理”模式对分配的内存空间进行清理,很容易导致无法找到元数据的问题,虽然说内存垃圾处理很重要,但是,在opencv中只需要释放自己显示分配的空间即可。

posted on 2013-02-27 17:05  0fengfan0  阅读(4426)  评论(0编辑  收藏  举报

导航