星期一, 3月 03, 2014

非常的sad,mac上在 Matlab 上加值 mexopenCV 遇到一大票的問題

裝完simpleITK後,現在想來裝看看openCV。畢竟openCV有更多的resource可以參考,似乎在快速建模方面,也比ITK有效率。由於我還是在matlab下工作,我選擇了mexopenCV來使用。
先講我的環境,我用的是macbook pro,osx 版本是10.9.2,我的matlab一開始是2013a,後來換成了2013b。

1. 先安裝openCV

果然跑不掉,還是要先安裝openCV。

一開始傻傻的下載source自已make,自已complie,後來高人指點,用macports或是homebrew。雖然一些網站,和日本東大強者的網頁都是使用macports來安裝。但我的朋友建議使用homebrew來安裝。畢竟homebrew不需要用sudo就可以安裝程式。(另外發現,homebrew和macports也可以安裝ITK喔!)

在shell中輸入以下指令來安裝homebrew:
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

然後再輸入:
brew tap homebrew/science
brew install opencv

等個幾分鐘,openCV就裝好了。

但是安裝openCV後,才發現兩者可安裝的版本是不一樣的。macports可以安裝到最新的2.4.8版,但是homebrew只有2.4.7.1,應該常用的函數差不了太多吧(自行安慰自已)。第二個差異是在openCV放置的位置,macports是放置在/opt/... ,而homebrew是放置在/usr/...。第三個差異在dependence的安裝,用macport,似乎會把全部用到的dependence全部安裝好,但是homebrew似乎就只裝好最必要的部份,像ffmpeg就不會自動幫你裝到好。

這一部份,可以再參考Installing OpenCV on Mac Mountain Lion/Mavericks來用homebrew安裝。
附帶的是手動安裝openCV的方法,以及另一個手動安裝openCV的方法。

2. pkg-config要安裝

還有一個重要的dependence,就是pkg-config要安裝。基本上安裝openCV時,都會裝好,只是後面matlab要呼叫它時,必需記得下指令:
setenv('PATH', [getenv('PATH') ':/opt/local/bin']);

後面要用到時,我會再提一次。

3. 安裝xcode

我們使用xcode當compiler。不必用homebrew安裝gcc48等等的來用(其實我安裝時遇到了error,一個dependence無法安裝)。
這一部份算是最簡單的,只要從mac的app store直接搜尋xcode、下載、安裝、就可以了。基本上是全自動的,我安裝的是5.0.1版。

有人說要再安裝command line tools of xcode。其實我爬文的結果,command line tools of xcode是有的,只是換位置了。你可以試著在shell中打:
gcc --version

如果沒有error,有顯示版本號,就沒問題啦!

4. 修改matlab相關的參數

要compile出matlab要的.mexmaci64,必需用到matlab、osx等的一些功能和函數庫。也要告訴matlab,要用那一個compiler等等的資訊。這些都寫在mexopts.sh之中。
請看Can I use Xcode 4.2 to 4.6 as my C or C++ compiler in MATLAB?(Updated: 2013/02/04)
不過,它只提供到osx 10.8的patch:optsPatch10.8.patch,並沒有10.9 mavericks的。其實無所謂,因為mac osx 10.9其實也有包括10.8的SDK在(在/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/就可以看到兩個併存)。而下面的步驟也可以再做修改,改到10.9的SDK去。下載好,到你的matlab根目錄中(我的電腦是在:/Applications/MATLAB_R2013a.app/bin/)解壓縮就好。可以在matlab中執行以下code:
cd(matlabroot)
!unzip -o ~/Downloads/optsPatch10.8.patch

然後,再在matlab中執行以下code,把mexopts.sh拷貝到matlab的工作目錄中:
mex -setup

再來,根據mexopenCV官網必需對工作目錄的mexopts.sh這個檔案做處理。可以直接在matlab中執行edit來做:
edit /Users/chaoh2/.matlab/R2013b/mexopts.sh

找到相對應的值,用以下的陳述替換掉:
CC='clang'
CXX='clang++'
SDKROOT='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/'
MACOSX_DEPLOYMENT_TARGET='10.9'
CLIBS="$CLIBS -lc++"
CXXFLAGS="-fno-common -no-cpp-precomp -fexceptions -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11 -stdlib=libc++ -DCHAR16_T"
CXXLIBS="$MLIBS -lc++"

至此,理論上已經完成所有的前置工作。行有餘力,可以再參考這一篇自問自答Compiling mexopencv in OS X 10.9 with Xcode 5 and Matlab R2013b,來處理之。

不過,我還是遇到一堆錯誤,像:
Undefined symbols for architecture x86_64:
ld: symbol(s) not found for architecture x86_64


In file included from src/MxArray.cpp:6:
In file included from include/MxArray.hpp:14:
In file included from /Applications/MATLAB_R2013b.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013b.app/extern/include/matrix.h:252:
/Applications/MATLAB_R2013b.app/extern/include/tmwtypes.h:830:9: warning: 'CHAR16_T' macro redefined
#define CHAR16_T
^
:2:9: note: previous definition is here
#define CHAR16_T 1
^

快瘋掉了。

沒有留言:

//for syntaxhighlighter 3 //看一下載入的JS模組有哪些,不要的就刪掉 //end syntaxhighlighter 3