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) 编辑 收藏 举报