zoukankan      html  css  js  c++  java
  • vs2012配置opencv及简单测试

    visual studio2012搭建openCV平台,实现打开图片。

    实现步骤:

    1.1、配置环境变量

    基于win7操作系统的环境配置步骤:

    1.1.1 计算机—>属性—>更改设置—>高级—>环境变量—>系统变量

    1.1.2 系统变量中选择新建,弹出的新建的系统变量.变量名中填写

    opencv,在下面变量值一栏填写F:opencvuildx86vc11in点击确定关闭。

    变量值为opencv的安装位置及dll文件,实现与vs2012的数据和资源共享。

    1.1.3 选择系统变量中的Path变量,点击编辑按钮在变量值的最后加上

    %opencv%;,点击确定。

    至此环境变量的配置完成。

    1.2配置VS2012环境(vs2012需在环境变量配置完后重新打开)

    1.2.1 新建工程步骤

       单击文件—新建—项目,弹出的菜单栏左边选择模板—> visual c++—> win32,选择win32控制台应用程序,设置名称为打开bmp文件,在弹出的文件应用向导中选择下一步—> 空项目—> 完成。

    1.2.2 VS2012配置openCV包含目录

    右键单击“打开bmp文件“—属性—配置属性—vc++目录—包含目录。

    在包含目录上方空白框内添加三条包含目录:F:opencvuildinclude   

    F:opencvuildincludeopencv

    F:opencvuildincludeopencv2单击确定完成包含目录的修改。

    1.2.3 VS2012配置库目录

    选择vc++目录—库目录。添加

    F:opencvuildx86vc11lib,点确定完成。

    1.2.4 配置附加依赖项

    往“打开bmp文件 属性页“左边配置属性—> 连接器—> 输入—>附加依赖项中添加:

    opencv_calib3d249d.lib

    opencv_contrib249d.lib

    opencv_core249d.lib

    opencv_features2d249d.lib

    opencv_flann249d.lib

    opencv_gpu249d.lib

    opencv_highgui249d.lib

    opencv_imgproc249d.lib

    opencv_legacy249d.lib

    opencv_ml249d.lib

    opencv_nonfree249d.lib

    opencv_objdetect249d.lib

    opencv_ocl249d.lib

    opencv_photo249d.lib

    opencv_stitching249d.lib

    opencv_superres249d.lib

    opencv_ts249d.lib

    opencv_video249d.lib

    opencv_videostab249d.lib

    这些为动态连接文件实现opencv与vs2012的代码连接。

    1.3利用openCV实现打开图片文件,以lena.png为例。

    1.3.1代码如下:

    #include "opencv2/opencv.hpp"

    int main()

    {

    IplImage *a = cvLoadImage("C:\Users\Administrator\Desktop\lena.png");  

    cvNamedWindow("lena");

    cvShowImage("lena",a);

    cvWaitKey(0);

    cvReleaseImage(&a);

    cvDestroyAllWindows();

    }

    1.3.2代码分析:

    1、

    #include "opencv2/opencv.hpp"分析,opencv2含有多个头文件,eg:

    #include "opencv2/core/core.hpp";

    #include "opencv2/photo/photo.hpp"等;但对于不知道所需库函数在哪时,可以用opencv2/opencv.hpp来代替,则包含所有opencv2的库函数。

    2、

    IplImage*a=cvLoadImage("C:\Users\Administrator\Desktop\lena.png");分析,IplImage是opencv里自带的的结构体指针变量,主要用处理图像大小,这里定义参数a为了在cvShowImage调用参数找到图片。

    IlpImage结构体还含有强制灰度转换功能只需加入代码:

    IplImage *a=cvLoadImage( "C:\Users\Administrator\Desktop\lena.png", 0 );

    结果如图:

      

    灰度处理过的图片用于计算像素点更方便。

    3、余下的几句根据英文可理解:

    cvNamedWindow("lena"),定义显示图片标题;

    cvShowImage("lena",a),显示已打开的图片文件;

    cvWaitKey(0),使显示的图片能够停留;

    cvDestroyAllWindows(),用于销毁所有highgui库函数里产生的窗口

    ;

    highgui函数的作用:窗口操作,eg:销毁窗口,更改名字,更改位置,大小等。

    1.3.3实现结果:

    实现图片的叠加;利用Rect实现矩阵读取图像特定部分。

    实现步骤:

    1、 实现图片的叠加功能

    1.1代码展示:

    #include "opencv2/opencv.hpp"

    #include 

    using namespace std;

    using namespace cv;    ……………………………………………..1.2.1

    int main()

    {

    double alpha = 0.5; double beta;double input;………………………...1.2.2

    Mat src1, src2, dst;         ………………………………………...1.2.3

    // Ask the user enter alpha

    cout<<"*Enter alpha [0-1]:";

    cin>>input;

    // We use the alpha provided by the useriff it is between 0 and 1

    if( alpha >= 0 && alpha <= 1)

    { alpha = input; }

    // Read image ( same size, same type )

    src1 =imread("C:\Users\Administrator\Desktop\lena.png");………1.2.4

    src2 =imread("C:\Users\Administrator\Desktop\pattern.png");

    if( !src1.data ) { printf("Errorloading src1  "); return -1; }…………..1.2.5

    if( !src2.data ) { printf("Errorloading src2  "); return -1; }

    // Create Windows

    namedWindow("Linear Blend", 1);

    beta = ( 1.0 - alpha );

    addWeighted( src1, alpha, src2, beta, 0.0,dst);…………………………1.2.6

    imshow( "Linear Blend", dst );

    waitKey(0);

    return 0;

    }

    1.2 代码分析

    1.2.1 如果在程序开始写上 using namespace cv;则cvrect可以简写为rect,cvsize可简写为size,但像cvIplImage等不能去掉cv。

    1.2.2 alpha用于输入两图片的线性融合比例,若为1则lena覆盖pattern,其余按比例进行叠加。

    Beta用于计算pattern所占比例,为之后的addWeighted提供数据。

    1.2.3 Mat类表示一个 n 维的密集数值单通道或多通道数组,imread()函数用于读取两个图片的像素点并储存在src1和是src2两个数组里,dst数组用于输出结果。

    1.2.4 imread(“文件地址“)用于读取图品文件的所有像素值,并赋给src数组。

    1.2.5 !src1.data用于判断文件位置是否正确,若读取文件失败则返回0值。

    1.2.6 addWeighted(α,weight1,β,weight2 , 常数,γ)用法;

    α——第一个图片的名称 。

    weight1——第一个图片的全部像素值(需要Mat类成员读入)。

    β——第二个图片的名称 。

    weight2——第二个图片的全部像素值(需要Mat类成员读入)。

    常数——用于微调两图片所占比例。

    γ——计算图片融合后结果γ=α*weight1+β*weight2 +常数;用于最终显示。函数 addWeighted 计算两数组的加权值的和。

    1.3 结果展示

    2、设定图像范围并显示

    2.1 代码展示:

    #include"opencv2/opencv.hpp"

    int main()

    {

       IplImage *src = cvLoadImage("C:\Users\Administrator\Desktop\lena2.png", 1);  

    //……………………………………………………………..2.1.1    

       CvRect interest_rect = cvRect(100, 50, 100, 100); //用CvRect结构设定一个感兴趣的区域(横坐标,纵坐标,长,宽)

    //……………………………………………………………..2.1.2

       IplImage *sub_img = cvCreateImageHeader(cvSize(interest_rect.width, interest_rect.height),src->depth, src->nChannels); 

    //……………………………………………………………..2.1.3

       sub_img->origin = src->origin;      //设定相同P的原点标准

       sub_img->widthStep = src->widthStep;//设定子图象的widthStep

       sub_img->imageData = src->imageData +

          interest_rect.y * src->widthStep +

          interest_rect.x * src->nChannels;//设定子图象的数据区域

    //…………………………………………………………..…2.1.4

       //cvAddS(sub_img, cvScalar(100, 100, 100), sub_img); //对图象做与运算

      // cvReleaseImageHeader(&sub_img);     //释放子图象头

     //  cvSaveImage("C:\Users\Administrator\Desktop\lena2.png", src); //保存处理后的图象

       cvShowImage("extention",sub_img);

       cvNamedWindow("Roi_add");        //创建一个窗口

       cvShowImage("Roi_add", src);   

       cvWaitKey();  

       return 0;

    }

    2.2 代码分析

    2.1.1 用cvLoadImage(文件名,常数)打开文件时,常数范围

    [0,1)时打开的为单通道灰度图像,其余数字为RGB图像。

    2.1.2 CvRect用于定位原点坐标,顺序为:横坐标,纵坐标,长,宽。

    2.1.3 cvCreateHeader(cvSize(cvRect子图形宽,长),src地址指向宽,地址指向长)函数用于定义子图像头。

    2.1.4 接下来,把原图像初始地址赋给子图像,初始化子图像宽度,通过赋值实现。

    设定子图像数据范围,interest_rect.y*

     src->widthStep +

          interest_rect.x * src->nChannels+imageData;

    定义了两个IlpImage结构体*src用于打开原图,sub_img用于定义子图像,通过cvCreateImageHeader(),引用cvRect里的成员实现。

    结果展示:

    总结

    1、   编程时遇到的问题:

          为vs2012配置的环境只能在一个文件中使用,要新建文件必须重新修改vc++目录及附加依赖项等。每次重新打开.vcxproj文件再输入代码可解决。

    2、   体会总结:

    openCV提供了很多对于图片的操作,例如灰度处理,图片线性融合,像素点提取都有现成的函数,但有些细节容易错,比如:在进行子图片与原图片与运算,定义子图片数据范围,cvAddWeighted()函数在算加和图像像素点时,里面的参数个数容易遗漏。

    通过看代码还感觉到一些算法虽然很简单但很难想到,就像图片线性融合,用像素值去乘比例,对于一个对像素没有概念的人很难理解。通过学习知道了像素的三个通道可分为三层,RGB值为点的坐标自然可以进行代数运算。

    另外,为了加强对像素点的学习,另外找到一个函数cvInitFont可用于读取像素点,有了每个坐标和对应像素就可以进行一些特征值提取的操作。

  • 相关阅读:
    GitHub Pages 绑定二级域名
    JS正则表达式(JavaScript regular expression)
    天猫魔盒远程安装APP
    'msbuild.exe' 不是内部或外部命令,也不是可运行的程序
    Jenkins自动更新与数据备份
    Jenkins插件无法更新、Jenkins插件不能下载问题解决
    安全测试工具wapiti的安装和使用(2)命令及参数解释
    安全测试工具wapiti的安装和使用(1)安装
    Jenkins远程构建和发布,基于IIS服务器(.netCore+vue)(三)
    Jmeter报错:java.net.ConnectException: Connection timed out: connect
  • 原文地址:https://www.cnblogs.com/fujj/p/4273562.html
Copyright © 2011-2022 走看看