• 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: 
     0: SQDIFF 
     1: SQDIFF NORMED 
     2: TM CCORR 
     3: TM CCORR NORMED 
     4: TM COEFF 
     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的位置进行配置才干够。

     


    參考:

    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


  • 相关阅读:
    Unity基础:AR(增强现实)的学习
    Fire Balls 04——平台组合,场景的美化
    Fire Balls 12——UI界面的制作
    Fire Balls 11——修正游戏的BUG
    Unity使用Rider作为IDE的体验
    Unity 5 使用Roslyn编译器支持C# 7
    MySQL 5.5主从复制(Replication)
    使用libcurl的正确姿势
    U盘安装Ubuntu Server 14.04
    arguments介绍(二)
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10539308.html
  • Copyright © 2020-2023  润新知