[转] matlab调用opencv函数的配置
原文地址百度账户 aleasa123
方式1
1、 首先保证vs2010能正确调用opencv函数,
2、 Matlab中选择编译器,操作如下:
打开matlab2012,输入mex –setup,出现如下提示:
Welcome to mex -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2012a/win32.html
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n? 输入y,出现如下提示:
Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2012a\sys\lcc
[2] Microsoft Visual C++ 2010 in C:\Program Files\Microsoft Visual Studio 2010
[0] None Compiler:
输入2,出现如下提示:
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: C:\Program Files\Microsoft Visual Studio 2010
Are these correct [y]/n?
输入y 出现如下提示,表明成功: ***************************************************************************
Warning: MEX-files generated using Microsoft Visual C++ 2010 require
that Microsoft Visual Studio 2010 run-time libraries be
available on the computer they are run on.
If you plan to redistribute your MEX-files to other MATLAB
users, be sure that they have the run-time libraries.
*************************************************************************** Trying to update options file: C:\Documents and Settings\zhangjing\Application Data\MathWorks\MATLAB\R2012a\mexopts.bat
From template: C:\PROGRA~1\MATLAB\R2012a\bin\win32\mexopts\msvc100opts.bat Done . . . **************************************************************************
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www.mathworks.com/help/techdoc/matlab_external/bsflnue-1.html
Building with the -largeArrayDims option enables the new API.
**************************************************************************
3、 配置一些目录
在matlab中,输入mex –v
下面会有显示:
-> Default options filename found in C:\Documents and Settings\zhangjing\Application Data\MathWorks\MATLAB\R2012a
----------------------------
-> Options file = C:\Documents and Settings\zhangjing\Application Data\MathWorks\MATLAB\R2012a\mexopts.bat
MATLAB = C:\PROGRA~1\MATLAB\R2012A
-> COMPILER = cl
-> Compiler flags:
COMPFLAGS = /c /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD
OPTIMFLAGS = /O2 /Oy- /DNDEBUG
DEBUGFLAGS = /Z7
arguments =
Name switch = /Fo
。。。。。。。。。(此处省略一些)
选中上面Options file=后面的部分,右键->Open Selection,打开mexopts.bat
找到下面部分,增加红色的部分
set MATLAB=%MATLAB%
set VSINSTALLDIR=C:\Program Files\Microsoft Visual Studio 2010
set VCINSTALLDIR=%VSINSTALLDIR%\VC
rem In this case, LINKERDIR is being used to specify the location of the SDK
set LINKERDIR=C:\Program Files\Microsoft SDKs\Windows\v7.0A\
set PATH=%VCINSTALLDIR%\bin;%VCINSTALLDIR%\VCPackages;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\Common7\Tools;%LINKERDIR%\bin;%MATLAB_BIN%;%PATH%
set INCLUDE=%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\ATLMFC\INCLUDE;%LINKERDIR%\include;%INCLUDE%;D:\opencv\include;D:\opencv\include\opencv;D:\opencv\include\opencv2
set LIB=%VCINSTALLDIR%\LIB;%VCINSTALLDIR%\ATLMFC\LIB;%LINKERDIR%\lib;%MATLAB%\extern\lib\win32;%LIB%;D:\opencv\build\x86\vc10\lib
set MW_TARGET_ARCH=win32
rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=cl
set COMPFLAGS=/c /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD
set OPTIMFLAGS=/O2 /Oy- /DNDEBUG
set DEBUGFLAGS=/Z7
set NAME_OBJECT=/Fo
rem ********************************************************************
rem Linker parameters
rem ********************************************************************
set LIBLOC=%MATLAB%\extern\lib\win32\microsoft
set LINKER=link
set LINKFLAGS=/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" opencv_core231d.lib opencv_highgui231d.lib opencv_video231d.lib opencv_ml231d.lib opencv_legacy231d.lib opencv_imgproc231d.lib opencv_flann231d.lib opencv_features2d231d.lib opencv_calib3d231d.lib opencv_objdetect231d.lib opencv_contrib231d.lib libmx.lib libmex.lib libmat.lib /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"
set LINKOPTIMFLAGS=
(注意上面include lib处要加分号,LINKFLAGS处各个lib之前要回空格)
在matlab当前目录下建立cpp文件(简单方法,txt改后缀为cpp),vs打开敲入代码,代码需要是Matlab的C语言接口风格,函数内部调用OpenCV函数演示功能,简化后的代码:程序命名为useOpenCV.cpp保存。
#include"mex.h"
#include "cv.h"
#include "highgui.h"
using namespacecv; voidmexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数组
int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组
{
char name[];
int buflens =mxGetNumberOfElements(prhs[]);
mxGetString(prhs[], name, buflens+);
if(!mxIsChar(prhs[]))
{
mexErrMsgTxt("First parameter must be string/n");
}
mexPrintf(name);
IplImage * img = cvLoadImage(name, );
if(img->imageData == NULL)
{
mexErrMsgTxt("Error in image/n");
}
cvNamedWindow("",);
//imshow("1",mat);
cvShowImage("",img);
cvWaitKey();
return; }
5 在matlab里输入 mex useOpenCV.cpp编译。
6 在matlab里输入命令调用编译好的文件:useOpenCV(‘lena.bmp’);即可调用。
方式2
利用Opencv2.4.3中的头文件和库文件
在matlab中利用mex命令编译C/C++文件时,可以利用Opencv2.4.3的头文件和库文件中已经定义的函数和类等模块。
(1) 对于头文件中已经定义的函数和类等模块时,需要在Opencv2.4.3的安装目录下找到对
应的头文件(*.h或*.hpp),并将其拷贝至mex命令所要编译的文件相同的目录下,并在C/C++文件中“#include”这个头文件,并将这个头文件中所涉及到的
“F:\opencv\build\include\opencv2”目录下的所有文件也拷贝至mex命令所要编译的文件相同的目录下。“ F:\opencv”为Opencv2.4.3的安装目录。
(2) 对于库文件中已经定义的函数和类等模块时,在C/C++文件中包含这个库文件,语句为
#pragma comment(lib, "opencv_calib3d243d.lib")
#pragma comment(lib, "opencv_contrib243d.lib")
#pragma comment(lib, "opencv_core243d.lib")
#pragma comment(lib, "opencv_features2d243d.lib")
#pragma comment(lib, "opencv_flann243d.lib")
#pragma comment(lib, "opencv_gpu243d.lib")
#pragma comment(lib, "opencv_highgui243d.lib")
#pragma comment(lib, "opencv_imgproc243d.lib")
#pragma comment(lib, "opencv_legacy243d.lib")
#pragma comment(lib, "opencv_ml243d.lib")
#pragma comment(lib, "opencv_objdetect243d.lib")
#pragma comment(lib, "opencv_ts243d.lib")
#pragma comment(lib, "opencv_video243d.lib")
并将上述所有的库文件从opencv的安装目录下找到拷贝至mex命令所要编译的文件相同的目
录下。
(3) 利用mex命令编译“*.cpp”文件就可获得“*.mexw64”文件。
(4) 例子
#include "mex.h" #include "cv.h"
//#include "highgui.h" #include "highgui.h"
#pragma comment(lib, "opencv_calib3d243d.lib")
#pragma comment(lib, "opencv_contrib243d.lib")
#pragma comment(lib, "opencv_core243d.lib")
#pragma comment(lib, "opencv_features2d243d.lib")
#pragma comment(lib, "opencv_flann243d.lib")
#pragma comment(lib, "opencv_gpu243d.lib")
#pragma comment(lib, "opencv_highgui243d.lib")
#pragma comment(lib, "opencv_imgproc243d.lib")
#pragma comment(lib, "opencv_legacy243d.lib")
#pragma comment(lib, "opencv_ml243d.lib")
#pragma comment(lib, "opencv_objdetect243d.lib")
#pragma comment(lib, "opencv_ts243d.lib")
#pragma comment(lib, "opencv_video243d.lib") IplImage *grey1 = , *grey0 = , *pyramid1 = , *pyramid0 = ;
int win_size = ;
CvPoint2D32f* points[] = {,}; void loadImageFromMatlab(const mxArray *mxImage, IplImage *image)
{
unsigned char *values = (unsigned char *) mxGetPr(mxImage); int widthStep = image‐>widthStep; int N = mxGetN(mxImage); // width
int M = mxGetM(mxImage); // height for(int i=;i<N;i++)
for(int j=;j<M;j++)
image‐>imageData[j*widthStep+i] = values[j+i*M];
} void mexFunction(int plhs_size, mxArray *plhs[], int prhs_size, const mxArray *prhs[])
{
// Load images if (prhs_size ==)
{
win_size = *mxGetPr(prhs[]);
} int N = mxGetN(prhs[]);
int M = mxGetM(prhs[]);
grey0 = cvCreateImage( cvSize(N, M), , );
grey1 = cvCreateImage( cvSize(N, M), , ); loadImageFromMatlab(prhs[],grey0);
loadImageFromMatlab(prhs[],grey1); // Load feature points
double *fp = mxGetPr(prhs[]);
int num_pts = mxGetN(prhs[]);
points[] = (CvPoint2D32f*)cvAlloc(num_pts*sizeof(points[][]));
points[] = (CvPoint2D32f*)cvAlloc(num_pts*sizeof(points[][])); char *status = (char*)cvAlloc(num_pts);
float *error = (float*) cvAlloc(num_pts*sizeof(float)); for (int i = ; i < num_pts; i++)
{
points[][i].x = fp[*i];
points[][i].y = fp[*i+];
} // neni treba, urychleni z fpt 40 ‐> fps 200
//cvFindCornerSubPix( grey0, points[0], num_pts, cvSize(win_size,win_size), cvSize(‐1,‐1), cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
pyramid1 = cvCreateImage( cvGetSize(grey1), , );
pyramid0 = cvCreateImage( cvGetSize(grey1), , ); cvCalcOpticalFlowPyrLK( grey0, grey1, pyramid0, pyramid1, points[], points[], num_pts, cvSize(win_size,win_size), , status, error, cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,,0.03), );
// Output plhs[] = mxCreateDoubleMatrix(, num_pts, mxREAL); double *output = mxGetPr(plhs[]);
for (int i = ; i < num_pts; i++)
{
output[*i] = (double) points[][i].x;
output[*i+] = (double) points[][i].y;
output[*i+] = (double) points[][i].x;
output[*i+] = (double) points[][i].y;
output[*i+] = (double) error[i];
output[*i+] = (double) status[i];
//output[5*i+5] = (double) error[i];
} // Tidy up
cvReleaseImage( &pyramid0 );
cvReleaseImage( &pyramid1 );
cvReleaseImage( &grey0 );
cvReleaseImage( &grey1 ); return; }
[转] matlab调用opencv函数的配置的更多相关文章
- matlab调用opencv函数的配置
环境: VS2010 活动解决方案平台x64 WIN 8.1 Opencv 2.4.3 Matlab 2012a 1. 首先保证vs2010能正确调用opencv函数, 2. Matlab中选择编 ...
- 【kate总结】matlab调用opencv总结
正常情况下,编写好matlab调用opencv的代码. 1.输入 MEX XX.CPP(所有的mex都要编译) 2.将生成的.mexw64 放到要调用的文件夹下即可 出错总结: 本人写的matla ...
- csharp通过dll调用opencv函数,图片作为参数
[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数 一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...
- OpenCV安装与配置
本文使用OpenCV2.48在win10平台下操作. 一,关于OpenCV OpenCV是开源C++计算机可视化处理库,它集成了很多计算机图形图像处理的功能.还有机器学习,字符识别,人脸识别,物体检测 ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- 向量和矩阵的范数及MATLAB调用函数
范数就是长度的一种推广形式,数学语言叫一种度量.比如有一个平面向量,有两个分量来描述:横坐标和纵坐标.向量的二范数就是欧几里得意义下的这个向量的长度.还有一些诸如极大值范数,就是横坐标或者纵坐标的最大 ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- opencv的resize和matlab的imresize函数的计算
在用c++代码复现matlab代码时,遇到两者resize函数的结果不相同的问题. opencv: resize(image1, reTmp, Size(, ), , , cv::INTER_LINE ...
随机推荐
- 数学:乘法逆元-拓展GCD
乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用 给出拓展GCD算法: 扩展欧几里得算法是指对于两个数a,b 一定能找到x,y(均为整数,但不满足一定是正数) 满足x*a+y*b=gcd(a ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- 【洛谷 P3304】[SDOI2013]直径(树的直径)
题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...
- CDLinux 自动休眠功能的关闭方法
CDLinux 自动休眠功能的关闭方法: 控制台下使用xset命令来完成. xset q 可以查看当前屏幕保护和电源管理的状态信息 具体设置时,常用的有以下参数: xset s //这个参数设置屏 ...
- python3,判断,循环练习1
1.使用while循环输出1 2 3 4 5 6 8 9 10 i = 1 while i <= 10: if i == 7: i += 1 print(end=' ') continue pr ...
- rtmp服务端实现
前言 网上好像没一篇讲的很完善的,可能和公司保密有关吧.先就最让人困惑(至少我是这样)且网上也很少找到答案的一个点讲一下id各是什么意思? (如果我哪里理解错了,希望大神指出,毕竟我也是看了好多资料及 ...
- 【反演复习计划】【bzoj3529】数表
Orz PoPoQQQ大爷 按照他ppt的解法,这题可以划归到之前的题了OrzOrz 跪wy写的题解(Stealth Assassin)https://www.luogu.org/wiki/show? ...
- php7安装及和php5的共存
http://blog.csdn.net/liuxinmingcode/article/details/50319145 http://www.jb51.net/article/109228.htm ...
- 对象存储 - Swift 原理 及 Swift+keystone+dashboard 架构搭建
1. 原理介绍 Swift 架构.原理及功能: http://www.cnblogs.com/sammyliu/p/4955241.html 总结的很详细也很全面,受益匪浅,感谢分享. 2. keys ...
- django自带的orm之查询
一.filter条件查询 用法: 模型类.objects.filter(模型类属性名__查询操作符 = 值) 判等: exact # 例:查询id为1的员工 select * from employe ...