vs2012配置opencv及简单测试
为visual studio2012搭建openCV平台,实现打开图片。
实现步骤:
1.1、配置环境变量
基于win7操作系统的环境配置步骤:
1.1.1 计算机—>属性—>更改设置—>高级—>环境变量—>系统变量
1.1.2 系统变量中选择新建,弹出的新建的系统变量.变量名中填写
opencv,在下面变量值一栏填写F:\opencv\build\x86\vc11\bin点击确定关闭。
变量值为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:\opencv\build\include
F:\opencv\build\include\opencv
F:\opencv\build\include\opencv2单击确定完成包含目录的修改。
1.2.3 VS2012配置库目录
选择vc++目录—库目录。添加
F:\opencv\build\x86\vc11\lib,点确定完成。
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 \n"); return -1; }…………..1.2.5
if( !src2.data ) { printf("Errorloading src2 \n"); 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可用于读取像素点,有了每个坐标和对应像素就可以进行一些特征值提取的操作。
vs2012配置opencv及简单测试的更多相关文章
- VS2012配置OpenCV、GDAL开发环境
VS2012和opencv-2.4.10 第一步:配置之前的准备工作. 完成VS2012的安装,以及opencv-2.4.10的下载和文件提取, 双击此文件,设置文件路径,即可得到提取文件,提取后的文 ...
- vs c++配置opencv(1)
环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...
- Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)
在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程. 提纲: 1.下载适用于Windows的darknet 2. ...
- struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)
为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...
- VS2012 配置 OpenCV3.0
VS2012 配置 opencv3.0,相比之前的版本,3.0的配置简单了好多. 通过配置属性文件,可以做到一次配置,重复使用! 根据文章的操作在 win7 64bit VS2012 下成功配置 op ...
- 使用属性表:VS2013上配置OpenCV
以前,windows下配置OpenCV一直不太方便:总是要手动添加lib,添加include,还要配置PATH使得程序运行时候能找到dll文件. 每次新建一个使用OpenCV的工程都要手动添加,很麻烦 ...
- 配置OpenCV的Qt开发环境
QT&openCV系列!链接:http://www.cnblogs.com/emouse/category/449213.html 本文链接:http://blog.csdn.net/qiur ...
- Qt 实现配置 OpenCV 环境,并实现打开图片与调用摄像头
一.说明 所用QT版本:5.9.1 电脑配置:win10,64位系统 调用的是编译好的:OpenCV-MinGW-Build-4.1.0(稍后放链接) 在大学期间,由于项目需求需要用到QT+openc ...
- 配置OpenCV产生flann\logger.h(66): error C4996: 'fopen': This function or variable may be unsafe问题[zz]
使用vs2012/2013配置opencv编译出现问题: 1>------ 已启动生成: 项目: Win32ForOpenCV245, 配置: Debug Win32 ------ 1> ...
随机推荐
- enumerateObjectsUsingBlock VS for(... in ...)
enumerateObjectsUsingBlock VS for(... in ...) for(... in ...)用起来非常方便.简洁,同时enumerateObjectsUsingBlock ...
- 仿QQ好友列表界面的实现
TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...
- XMLHttpRequest基础知识
XMLHttpRequest 发送请求的两个重要方法:open(method,url,async)——参数:请求方式.请求地址.请求同步/异步:send(string)——参数:使用POST方式时,填 ...
- jQuery源码学习:使用隐藏的new来创建对象
在JQuery源码中发现,JQuery定义一个类,但不用new关键字去创建该类对象,而使用方法调用()方式去创建该对象. 很多时候我们是这样写类,然后使用new创建对象的: function Pers ...
- [C++程序设计]有默认参数的函数
实参与形参的结合是从左至右顺序进行的.因此指定默认值的参数必须放在形参表列中的最右端,否 则出错.例如: void f1(float a,int b=0,int c,char d=′a′); //不正 ...
- 小希的迷宫(HDU 1272 并查集判断生成树)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- SMC MCU
Holtek推出e-Banking智能卡读卡器MCU——HT56RU25,继HT56RB27.HT56RB688 USB接口单片机之后,推出全新UART接口单片机.HT56RU25内建ISO7816- ...
- 【排序】表插入排序算法(C语言版)
排序耗时的操作主要分为两种:查找比较.记录移位. 1.表插入排序 在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的. 在数据结构上,数据是存储在静态 ...