首页 > 代码库 > OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate
OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate
1.什么是OpenCV
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成。
总结特点:
1.开源, 商业用途也不必公开自己的源代码或者改善后的代码。
2.效率高,简单的图像处理就算了,涉及到复杂的处理一般的类库无法满足比如CXImage
3.有巨头维护(Intel)
有这三个原因,OpenCV异常的火啊。
2.OpenCV环境配置
写博客的时候发现最新的是2.4.9了,下面讲的都是基于2.4.8,应该差距不大。
去www.opencv.org Windows下可以下载到一个exe的东西,大约345MB,执行就是解压,最终有3.7G。
弄过第三方类库的都懂的,配置好include和lib再加上Additional Dependencies加上要到的lib就配置完成了。
注意下上面的图,右边同个lib有两种类型,一个带d结尾表示Debug版本,没有的是Release版本。
下面来仔细的讲下具体配置,是32位VS2010 Win7。VS2010是英文版的。
因为OpenCV的文件夹位置可能会有变化,所以我们把OpenCV的根目录加到环境变量中,这样方便修改。
右击我的电脑,点击高级属性设置-》高级 就可以看到环境变量了。
我这里简单用一个变量OPENCV_DIR设置到OpenCV的build下。很多人看到搞环境变量就累了。其实就是把路径赋给一个变量,这样用这个变量的名字就是等同于它的值。Win7下面可能要注销或者重启电脑,环境变量才生效,反正我的是这样的.=。=
新建一个普通的Win32 Console的项目就行了。这个时候右击项目属性设置include,lib等也行,但这样不能复用,比如你建立了两个OpenCV的项目,每次都要设置,非常的麻烦。我们下面来建立Project Property Sheet,这个可以重复使用,看到Add Existing Property Sheet了没有。右击新建,我们分别建立两个,一个供Debug使用,一个供Release使用。
修改VC++ Directories 中的Include Directories 和 Library Directories,到图中的内容,看这里我们设置的环境变量就用上了$(OPENCV_DIR) 。你当然可以选择使用,那样灵活性差些。
在Linker中的input ->Additional Dependencies中加入5个lib的名字。因为下面的例子用到这5个lib就够了,以后可能就不够了,那个时候再添加额外的lib。因为这里是Debug的所以加了d结尾的lib,记得在Release中加没有d结尾的lib。248表示OpenCV的版本,因为我这里用的OpenCV是2.4.8版本,所以跟读者的可能会不一样。
添加好两个Project Property Sheet记得要保存下来,这样可以重复使用。
3.OpenCV简单例子
说是简单,因为是直接拷贝的官方例子,但效果不错。我本来想做一个炉石传说的外挂的,放弃了,我们看下这里有一个开始的按钮,人眼很容易就能找到那个蓝色的开始按钮,那么用OpenCV如何找到那个按钮呢?
把开始那个按钮截图下来。然后写下面的程序。
// HelloOpenCV.cpp : Defines the entry point for the console application. // #include "stdafx.h" // Video Image PSNR and SSIM #include <iostream> // for standard I/O #include <string> // for strings #include <iomanip> // for controlling float print precision #include <sstream> // string to number conversion #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar) #include <opencv2/highgui/highgui.hpp> // OpenCV window I/O #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; /// 全局变量 Mat img; Mat templ; Mat result; char* image_window = "Source Image"; char* result_window = "Result window"; int match_method; int max_Trackbar = 5; /// 函数声明 void MatchingMethod( int, void* ); int _tmain(int argc, _TCHAR* argv[]) { string originalImageName = "big1.png"; string matchImageName = "small1.png"; /// 载入原图像和模板块 img = imread( originalImageName, 1 ); templ = imread( matchImageName, 1 ); /// 创建窗口 namedWindow( image_window, CV_WINDOW_AUTOSIZE ); namedWindow( result_window, CV_WINDOW_AUTOSIZE ); /// 创建滑动条 char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED"; createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod ); MatchingMethod( 0, 0 ); waitKey(0); return 0; } /** * @函数 MatchingMethod * @简单的滑动条回调函数 */ void MatchingMethod( int, void* ) { /// 将被显示的原图像 Mat img_display; img.copyTo( img_display ); /// 创建输出结果的矩阵 int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; result.create( result_cols, result_rows, CV_32FC1 ); /// 进行匹配和标准化 matchTemplate( img, templ, result, match_method ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); /// 通过函数 minMaxLoc 定位最匹配的位置 double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); /// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好 if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ) { matchLoc = minLoc; } else { matchLoc = maxLoc; } /// 让我看看您的最终结果 rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); imshow( image_window, img_display ); imshow( result_window, result ); return; }
看OpenCV成功的找到的按钮的位置,标上了黑框,看到OpenCV的强大之处了吧?这还只是OpenCV的简单的一个功能。
4.例子下载:
http://www.waitingfy.com/?attachment_id=1111
注意直接运行是不会成功的,要根据读者OpenCV的位置进行配置才可以。
参考:
OpenCV 入门教程
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html#windows-visual-studio-how-to
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#template-matching