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

OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate,码迷,mamicode.com

时间: 2024-10-17 11:55:32

OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate的相关文章

Linux pwn入门教程(0)——环境配置

作者:[email protected] 0×00前言 作为一个毕业一年多的辣鸡CTF选手,一直苦于pwn题目的入门难,入了门更难的问题.本来网上关于pwn的资料就比较零散,而且经常会碰到师傅们堪比解题过程略的writeup和没有注释,存在大量硬编码偏移的脚本,还有练习题目难找,调试环境难搭建,GDB没有IDA好操作等等问题.作为一个老萌新(雾),决定依据Atum师傅在i春秋上的pwn入门课程中的技术分类,结合近几年赛事中出现的一些题目和文章整理出一份自己心目中相对完整的Linux pwn教程.

【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

本系列文章由@浅墨_毛星云 出品.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 1.下载和安装OpenCV SDK VS2010不用说,肯定都安装了吧.来说说当前最新的OpenCV版本2.4.8(2014年2月24日),2.4.9 (2014年4月)的下载和安装.与其说是安装,不如叫解压更加合适,因为我们下载的exe安装文件就是一个自解压程序而已. 在官网:http://opencv.org/上找到OpenCV

【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 这篇文章里,我们将一起探讨图像金字塔的一

系列文章 -- OpenCV入门教程

<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之十七]OpenCV重映射 & SURF特征点检测合辑 [OpenCV入门教程之十六]OpenCV角点检测之Harris角点检测 [OpenCV入门教程之十五]水漫金山:OpenCV漫水填充算法(Floodfill) [OpenCV入门教程之十四]OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑 [Ope

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会造成内存泄露.而且用起来超级麻烦,我们往往在debug的时候,很大一部分时间在纠结手动释放内存的问题.虽然对于小型的程序来说手动管理内存不是问题,但一旦我们写的代码变得越来越庞大,我们便会开始越来越多地纠缠于内存管理的问题,而不是着力解决你的开发目标. 这,就有些舍本逐末的感觉了. 而自从OpenCV踏入2.0时代,用Mat

【OpenCV入门教程之十七】OpenCV重映射 &amp; SURF特征点检测合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

【OpenCV入门教程之四】 ROI区域图像叠加&amp;初级图像混合 全剖析(转)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20911629 作者:毛星云(浅墨)    邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.8 在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像