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;
}

 

 

posted @ 2013-05-02 20:06  傻呵呵的日子  阅读(1448)  评论(0)    收藏  举报