更换了硬盘以后,从新配置了一次OpenCV,此次在下载的时候,发现有OpenCV3.1.0版本了,因此我就下载了截止到目前为止最新的版本进行配置。html
PS:我以前使用的是,OpenCV3.0.0+VS2013。具体的配置能够参考一下两个连接:
编程
http://blog.csdn.net/hyichao_csdn/article/details/41723825windows
http://jingyan.baidu.com/article/64d05a0245aa70de55f73b12.html数组
虽然配置OpenCV不是一件很繁琐的事情,可是由于不是很了解每一步的做用,因此有时候一不当心就会出错。下面就跟你们分享一下我配置的方法以及一些技巧。
服务器
在这以前,像作饭同样,咱们得先准备好材料:函数
VS2013+OpenCV3.1.0post
OpenCV3.1.0能够到OpenCV的官网上面下载:visual-studio
http://opencv.org/测试
下载完成后,获得的是一个.exe:
网站
接着运行它便可获得咱们须要的文件夹。
-------------------------------------------------------上面是一些准备工做,下面正式开始-----------------------------------------------------
我想介绍两种方法,前一种比较low,每次使用VS新建一个工程时,须要从新配置;后一种效率比较高,每次使用VS的时候只须要添加现有的属性表(不清楚属性表是什么不要紧哈,耐心往下看)便可,本文有一些截图过于细节,目的是为了方便初次配置的朋友,以前配置过的朋友能够跳着看哈。
(一)先来介绍第一种方法。
1、配置环境变量。
个人电脑(右键)——属性——高级系统设置——环境变量——Path(双击)
在原有的Path后面加上分号;而后加上D:/Work_Software/OpenCV3.1/opencv/build/x64/vc12/bin
注意加上的路径是你的电脑上build/x64/vc12/bin所对应的路径,不要照搬我上面的路径。
再注意最后不用加分号,分号只加在路径之间,并且切忌将原来的Path都删除!!!
PS:这个bin文件夹是什么来头呢?里面有一些dll文件,也就是动态连接库,能够理解成是opencv里面用到的函数的实现。
(初次配置OpenCV的朋友能够忽略此括号中的话,PS:配置过3.1.0以前版本的朋友会发现,3.1.0版本中build文件夹中只有x64文件夹,而没有了x86文件夹。也就是说,在配置3.1.0版本以后,使用VS进行OpenCV相关的编程的时候,只能使用64位的编译器,而不能使用32位的编译器了。这与以前版本有所不一样,以前是,32位系统只能使用32位的编译器,而64位的系统可使用32位或者64位的编译器。这个是我本身琢磨出来的,若是有错误的地方,欢迎指正。)
好了,到这里,环境变量就配置完成了,有的说法是,环境变量配置完成后须要重启一下电脑才能生效,这个没有亲测过,保险起见的话能够重启一下,顺便放松一下眼睛~~~~
2、VS中的配置。
(1)首先,打开VS2013并新建工程以下:
(2)接着,在源文件处新建一个main.cpp文件以下:
这样就完成了新建工程的任务,接下来就要对咱们新建的工程进行设置了。下面才是关键:
(3)将32位编译器Win32改成64位编译器x64,操做以下图:
(4)接下来,对工程test1进行设置,总共有三个东西须要设置:“包含目录”“库目录”以及“附属依赖项”,一个一个来。
第一,编辑包含目录以下:
选择build文件夹中的include文件夹操做以下:
设置好包含目录以后,咱们后面的使用中就能够在咱们程序的开头将与OpenCV有关的头文件经过“#include<opencv2/opencv.hpp>”这样的方式包含进来了。
PS:有的教程不只仅将include文件夹的路径添加到包含目录中,并且将include文件夹中opencv和opencv2这两个文件夹的路径也添加到包含目录中了。这一步无关紧要,区别在于,若是我将opencv2文件夹的路径也添加到包含目录中,那么我在个人程序开头就能够将上面说到的“#include<opencv2/opencv.hpp>”改写成“#include<opencv.hpp>”,编译器能够本身跑到opencv2文件夹中查找。
第二,编辑库目录,相似于编辑包含目录,将/build/x64/vc12/lib的路径添加到库目录中以下图(容易知道,lib也就是library库的缩写):
第三,添加附属依赖项以下:
须要注意的是,咱们这里添加的附属依赖项是以“d”结尾的,也便是Debug模式的,如实想用Release模式的话,则将上面的“opencv_world310d.lib”改成“opencv_world310.lib”便可。
配置过以前版本的朋友会发现,之前2点几版本的OpenCV须要添加一大堆的附属依赖项,到了3.0的时候仅仅须要两个.lib,到了3.1.0的时候,就只剩下一个了!!!
好了,到此为止,第一种方法就介绍完了,只要在新建的main.cpp文件中运行一下下面的测试代码:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat picture = imread("F://My_Desktop//1st//no_phone//1.jpg");
imshow("测试程序", picture);
waitKey(0);
}
就能够欣赏到咱们本身的劳动成果啦!imread后面的路径是所要显示的照片的路径,这里使用了“//”而不是“/”是由于“/”在C++中有转义的做用,因此要用两个“/”即“//”。
固然在前面也说到了,用这种方法的缺点是每次使用VS新建一个工程的时候,都要重复上面的2(1)-2(4)。因此,下面我将要介绍第二种方法!
---------------------------------------------------------第二种方法-----------------------------------------------------------------
(二)第二种方法。
1、配置环境变量。同上面的方法同样,若是在使用方法一的时候已经配置过了,那么这一步能够跳过。
2、VS中的配置。
(1)、(2)同(一)2(1)-(2)
(3)添加新项目属性表。
打开属性管理器:
这时候出现的窗口是下面这样的,这是使用32位编译器的状况,如上面说到的,咱们要将编译器改成64位的:
这时候须要打开配置管理器,新建x64:
这样操做以后,属性管理器窗口多出了两个东西以下:
接下来在Debug|x64或者Relase|x64右键(这里以Debug为例):
添加属性表,名称改为一个方便本身记忆的名字,我这里用的是opencv_3.1.props
接着,在咱们新添加的属性表处右键选择属性:
而后就获得了一个很亲切的窗口,没错,这个在上面出现过,设置的过程也跟上面同样。按照上面的(一)2(4)所说的方法设置好“包含目录”“库目录”以及“附属依赖项”。
好了,当你设置好点下“肯定”以后,你一样能够在main.cpp中输入(一)中给出的测试程序,运行便可。
下面是重点,当你下一次再打开VS新建工程的时候,你须要作的仅仅是下面的事情:
第一步:新建工程;
第二步:打开配置管理器(上面有说到如何打开),将Win32改成x64;
第三步:在属性管理器中,添加现有属性表,将上面制做好的opencv_3.1.props添加进来以下图所示。
这样就大功告成啦!!!接着在新建的main.cpp文件中就能够编程了,若是你不嫌烦的话,能够在试一下上面的测试程序。
谢谢你耐心看完它,但愿能对你有所帮助!
Visual Studio和MATLAB混合编程,有两种方法:
1 MATLAB调用C程序;
2 VS调用MATLAB(目前见到的都是VS,其余编译器如codeblocks,或不提供这项功能);
前一种是用MATLAB的mex命令调用VS或其余编译器,将以必定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),而后MATLAB就能够用调用动态连接库的方式,调用C程序。这一过程当中,只须要在安装好编译器的前提下,执行:
mex -setup
和
mbuild -setup
并按照提示循序渐进地帮助MATLAB找到C编译器就能够了。遇到MATLAB找不到Visual Stdio的状况时,可按照官方网站提供的方法,例如若是MATLAB找不到已安装的Visual Studio 2013,则在
http://www.mathworks.com/matlabcentral/fileexchange/44408-matlab-mex-support-for-visual-studio-2013--and-mbuild-
下载官方提供的文件,按照README的要求将文件复制到指定目录下便可。
README:
The files * msvc120engmatopts.bat * msvc120opts.bat * msvc120opts.stp should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mexopts . The files * msvc120compp.bat * msvc120compp.stp should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mbuildopts .
另外一种是反过来,由VS去调用MATLAB,由于归根结底,许多底层的代码都依赖于C/C++语言,若是要使用MATLAB进行实时的数据处理,那么必然是使用C/C++(从操做系统内核、套接字,或者设备)获取数据,再调用MATLAB进行处理。切入正题:
1 首先正确地安装好环境,以下是我使用的环境:
x86
Windows 7
VS2013
MATLAB R2010a(安装目录为D:\MATLAB\R2010a)。
2 下面是VS路径的包含:
右键项目—属性—VC++目录
—包含目录,添加D:\MATLAB\R2010a\extern\include;(注意分号)
—库目录,添加D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—C/C++(—常规),添加附加包含目录D:\MATLAB\R2010a\extern\include\;
—连接器
—常规,添加附加库目录D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—输入,添加附加依赖项:libeng.lib;libmat.lib;libmex.lib;libmx.lib;mclmcrrt.lib;mclmcr.lib;
3 系统环境变量:PATH里添加D:\MatLab\R2010a\bin\win32; 帮助VS找到MATLAB的提供的动态连接库。
4 注册MATLAB服务器:cmd,在D:\MatLab\R2010a\bin目录下运行
matlab \regserver
大概是开启MATLAB Server模式,接收VS的调用请求吧。
5 下面写C/C++程序:
添加头文件以及动态连接库:
#include "engine.h" #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libeng.lib") #pragma comment(lib, "libmx.lib") #pragma comment(lib, "libmat.lib")
打开引擎(引擎用来调用MATLAB):
Engine* pEng = NULL; if (!(pEng = engOpen(NULL))) { printf("Open matlab enging fail!"); getchar(); return -1; }
引擎打开函数openEng调用完毕后必定要检查是否打开成功(相似云malloc函数,申请完内存必定要检查是否申请成功),由于就算pEng==NULL,在函数engEvalString执行中也不会抛出异常的,只会致使engGetVariable执行失败,固然咯,由于根本没执行嘛,哪来的variable?
而后能够调用啦,一切的matlab命令均可以经过下面这个函数传入MATLAB执行,相似于Linux的系统调用exec("...")和windows的system("..."):
engEvalString(pEng, "x=0:0.01:pi); y=sin(x); plot(x, y)");
若是要获得MATLAB的返回结果:
engEvalString(pEng, "x=0:0.02:3.14; y=sin(x); plot(x, y)"); mxArray *x= engGetVariable(pEng, "x"); mxArray *y= engGetVariable(pEng, "y"); double * _x = mxGetPr(x); double * _x = mxGetPr(y); //此时_x为x数组,_y为y数组
因为MATLAB里面,数据都将当作矩阵来处理,所以返回结果也是以Array的方式返回,若是是单个值,就是array[0],不然为array[0..n-1],如何获得n呢?仍是用函数engGetVariable咯,能够先执行n=length(x),再将n传回。
执行结束后,记得关闭引擎:
if(pEng) engClose(pEng);
注意一旦关闭,就不能再使用pEng了,不然会抛出异常。而且,在关闭引擎后,本来在执行过程当中获得的figures也会关闭。在个人课题里面,引擎是在程序开始时打开,程序最终退出时才关闭。
6 若是在编译期间出现“找不到XXX.lib”的状况,检查路径是否正确添加,否则就直接复制lib文件到system32吧。。。
7 若是编译连接经过,运行起来仍是有异常,检查matlab server是否有注册成功:运行matlab /regserver,再试一试。
8 由于调用MATLAB执行的命令是以字符串形式传入的,千万注意字符串里面的特殊符号、空格。特殊符号前面须要加上反斜杆,如有空格,依据MATLAB的语法,应使用单引号。例如:
engEvalString(pEng,"cd \'E:\\Desktop\\Alilce and Bob\' ");
9 若是遇到ERROR LNK2019,如:
错误 1 error LNK2019: 没法解析的外部符号 _mxGetPr,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 2 error LNK2019: 没法解析的外部符号 _mxDestroyArray,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 3 error LNK2019: 没法解析的外部符号 _engEvalString,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 4 error LNK2019: 没法解析的外部符号 _engOpen,该符号在函数 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 5 error LNK2019: 没法解析的外部符号 _engClose,该符号在函数 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 6 error LNK2019: 没法解析的外部符号 _engGetVariable,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab 错误 7 error LNK1120: 6 个没法解析的外部命令 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\Debug\matlab.exe 1 1 matlab
检查MATLAB和VS是否运行在同一平台上,若是MATLAB是x64,那么配置管理器中必定要选中x64,不然选Win32:
右键项目——在配置管理器的下拉菜单里选中正确的平台,而后按照上面所述的过程从新配置路径。
以上~