MATLAB 2012b配置OpenCV2.4.9+PCL1.7

来源:互联网 发布:香港mac air价格 编辑:程序博客网 时间:2024/04/29 16:09

因为MATLAB的for循环运行速度太慢,程序想要计算1440744组最小二乘法拟合,用C语言读取并计算只需要不到20s,但是MATLAB运行却要200多秒,因此萌生了MATLAB调用C++的想法。

采用的版本是MATLAB 2012b,更新版本的因为取消了mexopts.bat,所以不推荐。

1. 设置编译器

记得安装Visual Studio 2010。安装完在MATLAB中运行mex -setup,设定:

[1] Microsoft Visual C++ 2010 in C:\Program Files (x86)\Microsoft Visual Studio 10.0 

为默认的编译器。

2. 设置mexopts.bat

MATLAB运行mex -v。不建议比2012b更新的MATLAB版本的原因就在这里,因为更新版的运行mex-v的时候会报错。

在出来的运行结果中有这样一行:

->    Options file           = C:\Users\TrueBlue\AppData\Roaming\MathWorks\MATLAB\R2012b\mexopts.bat 

选中后面的路径,右击选择Open Selection,从而打开mexopts.bat

下面的设置和在Visual Studio 2010中的设置类似,主要修改了四处:

set PATH=%VCINSTALLDIR%\bin\amd64;%VCINSTALLDIR%\bin;%VCINSTALLDIR%\VCPackages;%VSINSTALLDIR%\Common7\IDE;%VSINSTALLDIR%\Common7\Tools;%LINKERDIR%\bin\x64;%LINKERDIR%\bin;%MATLAB_BIN%;%PATH%中需要添加的是环境变量中的部分,这里在末尾%PATH%前添加C:\opencv2.4.9\build\x64\vc10\bin;C:\PCL\bin;


set INCLUDE=%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\ATLMFC\INCLUDE;%LINKERDIR%\include;%INCLUDE%是你建立C++工程时,配置项目属性中的包含目录,这里在末尾%INCLUDE%前添加C:\opencv2.4.9\build\include;C:\opencv2.4.9\build\include\opencv;C:\opencv2.4.9\build\include\opencv2;C:\Program Files\flann\include;C:\Program Files\Boost\include;C:\Program Files\VTK 5.8.0\include\vtk-5.8;C:\Program Files (x86)\Eigen\include;C:\PCL\include\pcl-1.7;


set LIB=%VCINSTALLDIR%\LIB\amd64;%VCINSTALLDIR%\ATLMFC\LIB\amd64;%LINKERDIR%\lib\x64;%MATLAB%\extern\lib\win64;%LIB%是你建立C++工程时,配置项目属性中的库目录,这里在末尾%LAB%前添加C:\Program Files\flann\lib;C:\Program Files\VTK 5.8.0\lib\vtk-5.8;C:\Program Files\Boost\lib;C:\PCL\lib;


最后设置set LINKFLAGS,相当于C++工程的项目属性中的链接器-输入-附加依赖项,注意这里需要用的是Release版本的。


Ctrl+s保存mexopts.bat。


3. 测试

PCL测试:

新建CPP文件,命名为test1.cpp(注意!是CPP文件!),输入下面代码:

#include "mex.h"
#include <io.h>
#include <string.h>
#include <stdio.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/io/ply_io.h>
#include <iostream>
#include <vector>
#include <pcl/filters/statistical_outlier_removal.h>
#include <fstream>
void mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组
    int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组
{
    char name[256];
    int buflens = mxGetNumberOfElements(prhs[0]);
    mxGetString(prhs[0], name, buflens+1);
     if(!mxIsChar(prhs[0]))
     {
        mexErrMsgTxt("First parameter must be string/n");
     }
    mexPrintf(name);
std::string fileName(name);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZRGB>);
std::cout<<"> loading ply data ..."<<std::endl;
pcl::PLYReader pclreader;
pclreader.read(fileName,*cloud_source);
pcl::io::savePLYFileASCII("D:\\matlab.ply",*cloud_source);
std::cout<<"> ALL DONE !"<<std::endl;
    return;
}

命令行输入mex test1.cpp,编译完成后即可直接在命令行中输入test1(1.ply),将1.ply放入MATLAB当前路径中,如果配置正确,会在D盘中生成matlab.ply文件。

opencv测试:

新建CPP文件,命名为test2.cpp(注意!是CPP文件!),输入下面代码:

#include "mex.h"
#include <cv.h>
#include <highgui.h>
void mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组
    int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组
{
    char name[256];
    int buflens = mxGetNumberOfElements(prhs[0]);
    mxGetString(prhs[0], name, buflens+1);
     if(!mxIsChar(prhs[0]))
     {
        mexErrMsgTxt("First parameter must be string/n");
     }
    mexPrintf(name);
std::string fileName(name);
    cv::Mat img=cv::imread(name);
    cv::imshow("image",img);
}

命令行输入mex test2.cpp,编译完成后即可直接在命令行中输入test2(1.bmp),将1.bmp放入当前MATLAB路径中,如果配置正确,会弹出窗口显示1.bmp图像。