matlab + c/c++ opencv 混合編程

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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.先安裝一些軟件和進行一些配置

在MATLAB中編譯C/C++ 文件時出現如下狀況:在MATLAB中安裝MinGW-w64 <wbr>C/C++ <wbr>編譯器的方法
說明缺乏MinGW-w64 C/C++ 編譯器。安裝方法以下
在MATLAB中安裝MinGW-w64 <wbr>C/C++ <wbr>編譯器的方法
二、安裝MinGW-w64 C/C++ 編譯器。注意:按照默認路徑安裝。
        安裝在其餘盤的話,再添加路徑的時候會出現 'D:\TDM-GCC-64' 不是內部或外部命令,也不是可運行的程序
三、在Windows 7/8/10上將MW_MINGW64設置爲系統環境變量:
對於MATLAB R2015b至R2017a,MW_MINGW64_LOC環境變量能夠:
(1)在Windows 7/8/10上將MW_MINGW64設置爲系統環境變量(爲整個系統級別設置):
a、首先,確保你有管理權限。
b、打開計算機的"控制面板",打開」控制面板「中的」系統與安全「中的」系統「。也就是系統屬性。
在MATLAB中安裝MinGW-w64 <wbr>C/C++ <wbr>編譯器的方法
c、從上圖菜單中選擇系統屬性。點擊高級系統設置>高級選項卡。點擊環境變量。
在MATLAB中安裝MinGW-w64 <wbr>C/C++ <wbr>編譯器的方法
d、在系統變量下,選擇新建。在「新建系統變量」對話框的「變量名稱」字段中輸入MW_MINGW64_LOC。
在變量值字段中,鍵入MinGW-w64編譯器安裝的位置,例如「C:\ TDM-GCC-64」。
在MATLAB中安裝MinGW-w64 <wbr>C/C++ <wbr>編譯器的方法


e、點擊「肯定」關閉對話框,而後關閉控制面板對話框。
(2)使用MATLAB將MW_MINGW64設置爲臨時環境變量:
在MATLAB命令窗口中運行如下命令:
>> setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')
其中「C:\TDM-GCC-64」是MinGW的安裝目錄。這種方法每次啓動MATLAB for MATLAB來正確使用MinGW時,都須要運行這個命令。命令到你的「startup.m」文件。每次MATLAB啓動時都會執行該命令。
 
 
-------------------------------------------
若是報錯
錯誤使用 mex LINK : error LNK2001: 沒法解析的外部符號 mexFunction 1.lib : fatal error LNK1120: 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

以後:

  • set OPENCV_EXTRA_MODULES_PATH to C:/opencv_contrib-3.4.0/modules
  • enable 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:

getBuildInformation

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文件夾路徑沒有指向文件所在位置致使的
相關文章
相關標籤/搜索