OpenCV库包含设置技巧与图像金字塔
推荐:OpenCV各版本学习官方材料(Tutorial,UserGuide等)http://opencv.org/documentation.html
(一)OpenCV库包含设置技巧
1.再也不需要每次添加包含目录和库目录、添加附加库
(1)打开任意一个工程
(2)View|Property Manager打开或者直接在左栏切换到Property Manager视图,右键Property,打开了一个咱们每次工程属性中设置的页面,在这里进行我们平时重复进行的那些设置:
右键|属性,VC++目录|包含目录,加上以下3条路径:
X:\Program Files (x86)\opencv2.4.3\opencv\build\include
X:\Program Files (x86)\opencv2.4.3\opencv\build\include\opencv
X:\Program Files (x86)\opencv2.4.3\opencv\build\include\opencv2
再在VC++目录|库目录加入一条路径:
X:\Program Files (x86)\opencv2.4.3\opencv\build\x86\vc10\lib
项目|右键|Properties|Linker|Input|Additional Dependencies中加入:
Debug中:
opencv_calib3d243d.lib
opencv_contrib243d.lib
opencv_core243d.lib
opencv_features2d243d.lib
opencv_flann243d.lib
opencv_gpu243d.lib
opencv_haartraining_engined.lib
opencv_highgui243d.lib
opencv_imgproc243d.lib
opencv_legacy243d.lib
opencv_ml243d.lib
opencv_nonfree243d.lib
opencv_objdetect243d.lib
opencv_photo243d.lib
opencv_stitching243d.lib
opencv_ts243d.lib
opencv_video243d.lib
opencv_videostab243d.lib
后边的d代表Debug
这时,这些库就成为了我们每次可以inherit(继承)的库。不过这对我们Release的设置可不妙哦,因为它同样也会继承,解决办法是切换到Release,然后取消inherit的勾选,将必要的(添加Debug中那些OpenCV以外系统默认有的库)以及我们Release对应的库(名字末尾没有d,如下所示):
opencv_calib3d243.lib
opencv_contrib243.lib
opencv_core243.lib
opencv_features2d243.lib
opencv_flann243.lib
opencv_gpu243.lib
opencv_haartraining_engine.lib
opencv_highgui243.lib
opencv_imgproc243.lib
opencv_legacy243.lib
opencv_ml243.lib
opencv_nonfree243.lib
opencv_objdetect243.lib
opencv_photo243.lib
opencv_stitching243.lib
opencv_ts243.lib
opencv_video243.lib
opencv_videostab243.lib
这样就通通OK啦。
(二)图像金字塔构建
(1)在OpenCV的C版本中,函数名字普遍地具有前缀cv,且单词的首字母大写(比如cvPryDown);而我们的2.4.3为小写首个单词(pyrDown),为方便书写,我们加上using namespace cv;以免去每次写cv::的辛劳
(2)由于版本的变化中变量已经大大改变(读取图像由IplImage*变为Mat),相应函数也发生变化:
新版本(2.4.3)
//! smooths and downsamples the image CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT ); //! upsamples and smoothes the image CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT ); //! builds the gaussian pyramid using pyrDown() as a basic operation CV_EXPORTS void buildPyramid( InputArray src, OutputArrayOfArrays dst, int maxlevel, int borderType=BORDER_DEFAULT );
老版本
PyrDown 图像的下采样 void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 ); src 输入图像. dst 输出图像, 宽度和高度应是输入图像的一半 ,传入前必须已经完成初始化 filter 卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5 函数 cvPyrDown 使用 Gaussian 金字塔分解对输入图像向下采样。首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。 PyrUp 图像的上采样 void cvPyrUp( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 ); src 输入图像. dst 输出图像, 宽度和高度应是输入图像的2倍 filter 卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5 函数 cvPyrUp 使用Gaussian 金字塔分解对输入图像向上采样。首先通过在图像中插入值为 0的 偶数行和偶数列,然后对得到的图像用指定的滤波器进行高斯卷积,其中滤波器乘以4做插值。所以输出图像是输入图像的 4 倍大小。
以创建金字塔为例博主写了一段代码测试功能,上代码~~~
// MyMatch0502.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <opencv2/opencv.hpp> #include <stdio.h> #include <opencv/cv.hpp> using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { Mat image=imread("D:\\Programing\\u0367panLeft.bmp"); Mat image_dst; vector<Mat> MatArray; if( !image.data ) { printf(" No data! -- Exiting the program \n"); return -1; } pyrDown( image, image_dst,Size( image.cols/2, image.rows/2 ) ); buildPyramid( image , MatArray , 3); namedWindow( "image", CV_WINDOW_AUTOSIZE ); namedWindow( "image_dst", CV_WINDOW_AUTOSIZE ); namedWindow( "MatArray0", CV_WINDOW_AUTOSIZE ); namedWindow( "MatArray1", CV_WINDOW_AUTOSIZE ); namedWindow( "MatArray2", CV_WINDOW_AUTOSIZE ); namedWindow( "MatArray3", CV_WINDOW_AUTOSIZE ); imshow("image", image); imshow("image_dst", image_dst); imshow("MatArray0", MatArray.at(0)); imshow("MatArray1", MatArray.at(1)); imshow("MatArray2", MatArray.at(2)); imshow("MatArray3", MatArray.at(3)); //此函数等待按键,按键盘任意键就返回 waitKey(); return 0; }
得到效果图:
图像金字塔MatArray0为原始图像,MatArray1-3分别为三层金字塔。MatArray的大小为
void buildPyramid( InputArray src, OutputArrayOfArrays dst,
int maxlevel, int borderType=BORDER_DEFAULT );
中的 maxlevel+1,MatArray.at(0)即原图,maxlevel为金字塔的层数,dst是个size为maxlevel+1的vector。
如上,可以看出buildPyramid的MatArray.at(1)与pyrDown( image, image_dst,Size( image.cols/2, image.rows/2 ) );的结果是一样的。就是第一层是缩小了2倍。
如上,原始影像与MatArray.at(0)也一样
再附上加上滑动轴显示金字塔不同层次效果代码:
// MyMatch0502.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <opencv2/opencv.hpp> #include <stdio.h> using namespace std; using namespace cv; /// 全局变量的声明与初始化 const int slider_max = 5; int slider_value; double alpha; double beta; /// 声明存储图像的变量 Mat image; vector<Mat> MatArray; /** * @function on_trackbar * @定义响应滑动条的回调函数 */ void on_trackbar( int, void* ) { buildPyramid( image , MatArray , slider_value); imshow("buildPyramid", MatArray.at(slider_value)); } int _tmain(int argc, _TCHAR* argv[]) { image=imread("D:\\Programing\\u0367panLeft.bmp"); if( !image.data ) { printf(" No data! -- Exiting the program \n"); return -1; } namedWindow( "buildPyramid", CV_WINDOW_AUTOSIZE ); createTrackbar("Threshold1", "buildPyramid", &slider_value,slider_max,on_trackbar); // 结果在回调函数中显示 on_trackbar( slider_value, 0 ); //此函数等待按键,按键盘任意键就返回 waitKey(); return 0; }

浙公网安备 33010602011771号