%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%html
辛苦原創所得,轉載請註明出處
java
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%python
在配置前能夠在matlab裏輸入 mex -setup 來看下環境,檢測vs結果有網友說跟是否正版有關,本人也不是很清楚。ios
這裏要說明的是安裝很新版本matlab的時候,當破解文件拷貝完後仍然出現出現error -8錯誤沒法啓動,那是由於windows系統的問題,能夠用windows 易升來對系統進行升級,而後就能夠運行了,這塊本身耗掉了好長時間。c++
有些matlab裏會顯示以下(matlab 2017a盜版),我電腦裏有vs 2010和vs 2015,可是都沒有檢測出來,我本身按照後面的方式安裝了mingw64了git
個人另外一個matlab 2014盜版的顯示以下,說明檢測出來vs 2010了(這個是選擇vs2010編譯器以後的圖)github
學校提供的matlab 2017b正版能夠檢測出來以下,兩個編譯器都檢測出來了.不過正版必須時刻聯網都能用,不是很方便segmentfault
其實這時候選擇vs的編譯器就能夠對c程序進行編譯了,主要要使用mexFunction()進入接口函數.具體能夠查看網上相關。windows
測試數組
mex_test.cpp:
#include "mex.h"
#include "iostream"
#include "mex_test.h"
using namespace std;
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
//void main()
{
//int *i;
//i = mxGetPr(prhs[0]);
//if (i[0] == 1)
int a = abc(1);
std::cout << a;
//mexPrintf("hello,world!\n");
//else
//mexPrintf("你們好!\n");
}
mex_test.h
#pragma once
int abc(int a);
abc.cpp
#include "mex_test.h"
int abc(int a)
{
return a;
}
以後在 matlab 裏輸入 mex a.c b.c c.c -output c.mexw64 這裏其實不用輸入 -output c.mexw64
若是實在不能檢測出來vs編譯器,還不想換matlab版本,那麼按照下面來操做配置(不建議,比較麻煩)
1.先安裝一些軟件和進行一些配置
==錯就錯在沒有,,每一個要被編譯成mex的.c(c和c++同理)中有必須有下面的函數做爲主函數(相似main函數的地位)取消選擇:
// Matlab interface Function
// 參數:
// nlhs和nrhs表示調用該函數時返回值和參數的個數
// prhs[]和plhs[]表示參數和返回值數組
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
...
}
----------------------------------
若是想讓matlab 2017a調用vs 2017編譯器,則須要打個補丁,補丁下載地址以下
https://ww2.mathworks.cn/support/bugreports/1487958
解壓並將下的兩個文件複製到MATLAB安裝文件夾對應目錄下,而後就MATLAB就能夠調用VS2017的編譯器了。
---------------------------------------------------------------------------------------------------
matlab使用mexopencv鏈接opencv
所需環境:
vs 2017 社區版 + matlab2018a + opencv3.4.0 + cmake3.11.4(這種版本搭配經過好多嘗試,因此不要換爲其餘版本,不然會報錯)
cmake下載地址
https://cmake.org/download/
編譯
下載以下的cmake(含有cmake-gui.exe)
以後對opencv進行編譯,這裏configure選擇visual studio 15 2017 win64
bin\win64\mexopts
BUILD_DOCS
, BUILD_EXAMPLES
, BUILD_JAVA
, BUILD_PACKAGE
, BUILD_PERF_TESTS
, BUILD_TESTS
BUILD_opencv_apps
, BUILD_opencv_cuda*
, BUILD_opencv_cudev
, BUILD_opencv_java
, BUILD_opencv_js
, BUILD_opencv_python*
, BUILD_opencv_ts
, BUILD_opencv_viz
, BUILD_opencv_world
under "OPENCV" group,這裏須要提早下載好opencv_contrib,下載地址參照
https://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29
以後:
OPENCV_EXTRA_MODULES_PATH
to C:/opencv_contrib-3.4.0/modules
OPENCV_ENABLE_NONFREE
under "WITH" group, 取消選擇:
WITH_CUDA
, WITH_CUFFT
, WITH_CUBLAS
, WITH_NVCUVID
, WITH_MATLAB
, WITH_VTK
press Configure again
under the newly added "BUILD" group (displayed in red), deselect the following modules if possible:這裏若是沒有顯示紅色就能夠忽略
BUILD_opencv_cvv
, BUILD_opencv_freetype
, BUILD_opencv_hdf
, BUILD_opencv_matlab
, BUILD_opencv_ovis
, BUILD_opencv_sfm
press Configure yet another time
press Generate
close CMake
build opencv
在編譯好的文件夾中用vs2017打開opencv.sln,
調整到 release 模式(此時是x64)
build->all build, 若是此步驟出錯的話,說明 cmake 版本沒喲用對
build->install, 運行完此時在編譯後目錄中會生成一個 install 文件夾
C:\opencv3.4.0_cmake3.11\install\x64\vc15\bin 路徑加入到系統環境變量中
打開matlab(管理員權限),輸入以下指令,具體名字根據本身所起的名字而定
>>mexopencv.make('clean',true) 這步若是顯示沒有函數,則說明之前沒有配置過
>> cd('C:\mexopencv3.4.0') >> addpath('C:\mexopencv3.4.0') >> addpath('C:\opencv_contrib-3.4.0')
最後運行下面指令前關閉殺毒軟件,不然會報以下錯誤,索性連防火牆也關閉.
general error c101008d: Failed to write the updated manifest to the resource of file
"C:\mexopencv3.4.0\+cv\HoughLines.mexw64".
錯誤解決能夠參考以下網址
https://social.msdn.microsoft.com/Forums/vstudio/en-US/dbb6c5db-9c34-46e6-af95-b56bf95ed345/error-c101008d?forum=clr
運行
>> mexopencv.make('opencv_path','C:\opencv3.4.0_cmake3.11\install', 'opencv_contrib',true)
最後運行
>> cv.getBuildInformation()
You should see something like:
Congratulation, now you have OpenCV working in MATLAB!
配置終於完成,花了近一週的時間
matlab可使用的opencv庫函數以下網址
https://kyamagu.github.io/mexopencv/matlab/index.html
------------------------------------------------------------------------
matlab 調用含有opencv的c++程序
網上說須要配置以下文件
打開文件mex_C++_win64.xml
弄了好久一直沒弄好,後來發現按照以下方式進行編譯就能夠:
mex mex_test.cpp -Ic:\opencv3.4.0\build\include\opencv -Ic:\opencv3.4.0\build\include -Ic:\opencv3.4.0\build\include\opencv2 -Lc:\opencv3.4.0\build\x64\vc15\lib -lopencv_world340
若是是在matlab中配置的是opencv2編譯引擎的的話,參照以下編譯(別人的說明,我沒有配置opencv2)
mex mex_test.cpp -IF:\opencv\build\include -LF:\opencv\build\x64\vc10\lib -lopencv_core249 -lopencv_imgproc249 -lopencv_highgui249
若是編譯出現 error C2061: 語法錯誤: 標識符「mxArray」 的錯誤,在c程序中缺乏了"mex.h"
另外在matlab下配置了默認的opencv引擎的話,則其餘版本的opencv是不能使用的,如上面寫的mex mex_test.cpp -IF:\opencv\build\include -LF:\opencv\build\x64\vc10\lib -lopencv_core249 -lopencv_imgproc249 -lopencv_highgui249
是會報錯的.
關於如何使用mexFunction的資料能夠參考以下網址
http://blog.sina.com.cn/s/blog_7e71290d0101fkk7.html
------------------------------------------------------------------------------------
matlab與vs聯合調試
在 mex c 文件的時候,使用mex -g XXX.cpp/XXX.c, 這樣就是一個debug 文件了,而後打開 vs ,選擇 工具--附加到進程,選擇matlab.exe,這樣vs 和matlab 之間就創建起了聯繫
而後經過 vs 在 cpp 文件裏設置斷點, 再運行相關matlab文件。
f9加載斷點,f5下一步。
在vs中程序以下
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//mlj
int n_mex = mxGetN(prhs[0]); //得到矩陣的列數
int m_mex = mxGetM(prhs[0]); //得到矩陣的行數
double *data_mex;
data_mex = mxGetPr(prhs[0]); //得到指向矩陣的指針
for (int i = 0; i < m_mex; i++)
for (int j = 0; j < n_mex; j++)
{
mexPrintf("%4.3f ", data_mex[j*m_mex + i]); //以行爲主序輸出
mexPrintf(" ");
}
plhs[0] = mxCreateDoubleMatrix(m_mex, n_mex, mxREAL); //返回到matlab數據
在matlab中書寫程序
matrix = [1,2,3;4,5,6];
vs = example(matrix);
在數據框中能夠看到
vs = [0,0,0;0,0,0]
事實上以上的mexPrintf也可使用cout顯示.
在返回的時候要首先用 mxCreateDoubleMatrix 申請mxArray類型數據或其餘類型數據,而後用 mxGetPr 得到其數據才能操做返回,且使用
這些函數的時候必須在mexFunction函數裏使用
plhs[0] = mxCreateDoubleMatrix(1,6, mxREAL);
double *data_out_mex = mxGetPr(plhs[0]);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
data_out_mex[i * 3 + j] = a[i][j];//總之,在C中,二維數組也是按照一維處理的
注意在使用matlab編譯c程序時候,不要開啓vs的連接進程,不然會出錯,還有一點很是重要的是,若是c程序裏有調用的文件在系統目錄中沒有,則matlab調用vs程序時候會崩潰,並且不報任何錯誤,或提示建議重啓matlab.具體對的mexFunction的使用能夠參考下面網址https://www.cnblogs.com/rong86/p/3703704.htmlhttps://www.cnblogs.com/arxive/p/4687766.html------------------------------------------------------------------------------------另外好像新的matlab調用opencv的方法參考網頁https://blog.csdn.net/majinlei121/article/details/52343558https://github.com/kyamagu/mexopencvhttps://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29http://www.cnblogs.com/youth0826/archive/2012/08/13/2635684.html好像比較簡單的配置以下(這種方法不是很明白怎麼回事)https://segmentfault.com/a/1190000009622411?utm_source=debugrun&utm_medium=referral軟件下載地址:mexopencvhttps://github.com/kyamagu/mexopencv------------------------------------------------------------------------------------------報錯:1.有時候會出現錯誤的使用cv.imread這樣的錯誤,有多是由於matlab文件夾路徑沒有指向文件所在位置致使的