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简单样例
说是简单。由于是直接拷贝的官方样例。但效果不错。我本来想做一个炉石传说的外挂的,放弃了。我们看下这里有一个開始的button,人眼非常easy就能找到那个蓝色的開始button,那么用OpenCV怎样找到那个button呢?
把開始那个button截图下来。然后写以下的程序。
// 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成功的找到的button的位置。标上了黑框。看到OpenCV的强大之处了吧?这还仅仅是OpenCV的简单的一个功能。
4.样例下载:
http://www.waitingfy.com/?attachment_id=1111
注意直接执行是不会成功的。要依据读者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的更多相关文章
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十七】OpenCV重映射 & SURF特征点检測合辑
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...
- 【OpenCV新手教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/28261997 作者:毛星云( ...
- 【OpenCV新手教程第14】OpenCVHough变换:霍夫变换线,霍夫变换圆汇编
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...
- 第一站:CLion安装教程与环境配置
原文来自:http://www.sunmey.cn/thread-129-1-1.html 本人:找了很久才找到的CLion安装教程与环境配置,这里分享给大家~ 这里要说明的一点是CLion是要钱的, ...
- 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...
随机推荐
- Django项目:CRM(客户关系管理系统)--47--38PerfectCRM实现全局账号登录注销02
图片另存为 16*16 名字修改为 global_logo.jpg /*! *bootstrap.js * * Bootstrap v3.3.7 (http://getbootstrap ...
- web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
1.window对象 1.1.window对象: window对象是BOM的核心,window对象指当前的浏览器窗口 所有javaScript全局对象.函数以及变量均自动生成为window对象的成员 ...
- log4j2----JAVA日志打印
注意:本篇文章是以log4j2.x 为例的,并不是log4j 1.x log4j 就是log for java , log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中 ...
- 采坑“微信小程序”
1.微信小程序变量定义时中间不能使用 “-”. 2.padding值不能为负.
- Vue.之.项目开发工具选用
Vue.之.项目开发工具选用 上篇文章记录了创建项目,这篇文件记录,如何对创建的项目进行开发.这里选择一个工具:Visual Studio Code (请自行下载安装) 1. 打开VSCode工具,并 ...
- 页面PC端 / 移动端整屏纵向翻页,点击/触摸滑动效果功能代码非插件
页面翻页,滑动功能示范代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Ubuntu 服务器默认的root账号是没有激活的,需要用初装的用户账号给root设置管理密码
user@ubuntu12:~$ sudo password root //用sudo修改账户 1.根据提示输入当前用户的密码: 2.修改成功之后你就可以使用root账号了,可以使用su root 命 ...
- Zookeeper 扫盲
Zookeeper 扫盲 :disappointed_relieved: 配置文件详解: tickTime:基本事件单元,以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持心跳 ...
- history-之前发生了什么
查看一下之前服务器上执行过的命令.看一下总是没错的,加上前面看的谁登录过的信息,应该有点用.另外作为admin要注意,不要利用自己的权限去侵犯别人的隐私哦. 到这里先提醒一下,等会你可能会需要更新 H ...
- 洛谷P2196 挖地雷 [2017年4月计划 动态规划13]
P2196 挖地雷 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之 ...