OpenCV3.1.0+VS2013配置+Win10(64位)(轉載) 【環境】VS2013和MATLAB相互調用混合編程

OpenCV3.1.0+VS2013配置+Win10(64位)

【環境】VS2013和MATLAB相互調用混合編程

Matlab 2016a和VS2013混合Dll編程步驟

更換了硬盤以後,從新配置了一次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位的編譯器。這個是我本身琢磨出來的,若是有錯誤的地方,歡迎指正。)
        好了,到這裏,環境變量就配置完成了,有的說法是,環境變量配置完成後須要重啓一下電腦才能生效,這個沒有親測過,保險起見的話能夠重啓一下,順便放鬆一下眼睛~~~~

 

       2VS中的配置。

        (1)首先,打開VS2013並新建工程以下:

        (2)接着,在源文件處新建一個main.cpp文件以下:

        這樣就完成了新建工程的任務,接下來就要對咱們新建的工程進行設置了。下面纔是關鍵:

        3)將32位編譯器Win32改成64位編譯器x64,操做以下圖:




        4)接下來,對工程test1進行設置,總共有三個東西須要設置:包含目錄」「庫目錄以及附屬依賴項,一個一個來。

          第一,編輯包含目錄以下:




 

        選擇build文件夾中的include文件夾操做以下:


        設置好包含目錄以後,咱們後面的使用中就能夠在咱們程序的開頭將與OpenCV有關的頭文件經過「#include<opencv2/opencv.hpp>」這樣的方式包含進來了。

        PS:有的教程不只僅將include文件夾的路徑添加到包含目錄中,並且將include文件夾中opencvopencv2這兩個文件夾的路徑也添加到包含目錄中了。這一步無關緊要,區別在於,若是我將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新建一個工程的時候,都要重複上面的21-24)。因此,下面我將要介紹第二種方法!


---------------------------------------------------------第二種方法-----------------------------------------------------------------

 

(二)第二種方法。

        1、配置環境變量。同上面的方法同樣,若是在使用方法一的時候已經配置過了,那麼這一步能夠跳過。

        2VS中的配置。

 

        1)、(2)同(一)21-2

       3)添加新項目屬性表。

       打開屬性管理器:


        這時候出現的窗口是下面這樣的,這是使用32位編譯器的狀況,如上面說到的,咱們要將編譯器改成64位的:


        這時候須要打開配置管理器,新建x64




 

        這樣操做以後,屬性管理器窗口多出了兩個東西以下:


 

       接下來在Debug|x64或者Relase|x64右鍵(這裏以Debug爲例):


        添加屬性表,名稱改爲一個方便本身記憶的名字,我這裏用的是opencv_3.1.props


        接着,在咱們新添加的屬性表處右鍵選擇屬性:


        而後就獲得了一個很親切的窗口,沒錯,這個在上面出現過,設置的過程也跟上面同樣。按照上面的(一)24)所說的方法設置好包含目錄」「庫目錄以及附屬依賴項」。


 

        好了,當你設置好點下肯定以後,你一樣能夠在main.cpp中輸入(一)中給出的測試程序,運行便可。

       下面是重點,當你下一次再打開VS新建工程的時候,你須要作的僅僅是下面的事情:

       第一步:新建工程;

       第二步:打開配置管理器(上面有說到如何打開),將Win32改成x64

       第三步:在屬性管理器中,添加現有屬性表,將上面製做好的opencv_3.1.props添加進來以下圖所示。


        這樣就大功告成啦!!!接着在新建的main.cpp文件中就能夠編程了,若是你不嫌煩的話,能夠在試一下上面的測試程序。

 

        謝謝你耐心看完它,但願能對你有所幫助!

轉載:http://www.th7.cn/Program/cp/201603/773871.shtml
 
 
 
 

 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:

  右鍵項目——在配置管理器的下拉菜單裏選中正確的平臺,而後按照上面所述的過程從新配置路徑。

 

以上~

相關文章
相關標籤/搜索