星期五, 3月 07, 2014

最後,mexopenCV 在 matlab下一個簡單的實作

我的mexopenCV,經過前置作業error的解決,終於編好了,可以用了吧??

一在matlab run下去,就出現傳說中的Invalid MEX file。差點拿電腦起來砸!!!
不過,這個錯誤在之前爬文時就有看見,所以就是我的openCV版本太多,compile失敗太多次的結果吧。
回到/Applications/MATLAB_R2013b.app/bin/maci64 中,一不作二不休,把目錄下的所有 libopencv___.dylib全砍了。
終於,它乖乖的可以在matlab下執行了。

我現在執行的是東大的code,不過我個人把它修改過了,將兩個code連結起來,就可以啟動camera,同時做人臉辨視:

% Load a face detector and an image
detector = cv.CascadeClassifier('/Users/chaoh2/Documents/MATLAB/haarcascade_frontalface_alt.xml');

% Connect to a camera
camera = cv.VideoCapture();
pause(1);

for i = 1:100
% Capture frame
frame = camera.read; 

% Preprocess
gr = cv.cvtColor(frame, 'RGB2GRAY');
gr = cv.equalizeHist(gr);

% Detect
boxes = detector.detect(gr, 'ScaleFactor',  1.3, ...
                            'MinNeighbors', 2, ...
                            'MinSize',      [30, 30]);
% Draw results
imshow(frame);

for i = 1:numel(boxes)
        rectangle('Position',  boxes{i}, ...
                  'EdgeColor', 'g');
end
    
pause(0.001);
end

camera.delete;
pause(1);
close all

突然有了小小的成就感,不必砸電腦了。

在 Matlab 上加值 mexopenCV 來使用 openCV的功能

我在前一篇,已經詳細的記錄了大部份要compile mexopenCV 的前置工作,但是在我下了下面的命令,還是遇到了error。
mexopencv.make('clean', true);
mexopencv.make


它一直出現類似:
Undefined symbols for architecture x86_64:
  "cv::merge(std::vector > const&, cv::_OutputArray const&)", referenced from:
      MxArray::toMat(int, bool) const in libMxArray.a(MxArray.o)
  "cv::split(cv::Mat const&, std::vector >&)", referenced from:
      MxArray::MxArray(cv::Mat const&, mxClassID, bool) in libMxArray.a(MxArray.o)
  "std::string::compare(char const*) const", referenced from:
      MxArray::toRange() const in libMxArray.a(MxArray.o)
  "std::string::_Rep::_M_destroy(std::allocator const&)", referenced from:...........
............

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

    mex: link of ' "+cv/CamShift.mexmaci64"' failed.

make: *** [+cv/CamShift.mexmaci64] Error 1


的錯誤。

星期一, 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就裝好了。

星期二, 2月 25, 2014

如何給強大的 Matlab,再外加 ITK 的大力丸咧?(裝機篇)

上次稍稍和大家提過,醫學影像的處理,有一大部份是使用insight toolkit (ITK)了。而ITK和matlab的互通,也有不少人努力過,包括有matitk, simitk以及現在要提的 simpleITK

其實,simpleITK並不是使用最方便的.mex編譯,可以直接呼叫。而是透過 java的使用來implement。當然,也可以透過c++,c#,那不如直接去呼叫原始的 ITK,不必使用精簡版本的simpleITK。另外,simpleITK也有python版本,matlab也可以執行python腳本,但是效能並沒有java來得好。

只是,matlab並不能像執行.m file,或是呼叫.mexmaci64一般的直接執行 java code,必需經過一些處理。接下來就把小弟不才我胡搞瞎搞兩天的功力,全放在這兒了。

星期一, 2月 24, 2014

如何給強大的 Matlab,再外加 ITK 的大力丸咧?(介紹篇)

直想要做些醫學影像的研究,所以小弟我涉獵了一些影像研究的東西。但是經歷上根本不是學computer science的,血液中流的也不是程式設計師的血,只好勉強用用matlab來解決我的問題。雖然matlab的image toolbox相當強大,但是,做影像的永遠都差那麼一些些,所以也需要一些外加的程式庫來運用。

有不少朋友都問我,要做影像為什麼不用openCV?說真的,openCV真是個好物,對我而言,還有強者Kota Yamaguchi 幫它轉成matlab認得的function,更是加快在matlab上的應用。但是openCV在體質上,並不太適合用在醫學影像。它大部份的程式庫,不管2D或3D,都是處理8 bit, 3 channel的彩色影像為主,只有少數函式可以接受double的數值。而醫學影像卻常常是12 bit, 1 channel的灰階影像(其值大多在-1024 ~ 1023之間,我實際處理,有遇過數值到達16k的範圍)。這樣的資料丟到openCV的程式庫裏去,要嗎被吐出來,不然就是給個怪怪的結果。所以,必需做些資料轉換的工作,甚至要把 Grayscale的部份劣化。就看你能不能接受這樣的結果。
//for syntaxhighlighter 3 //看一下載入的JS模組有哪些,不要的就刪掉 //end syntaxhighlighter 3