processing +opencv

最近在研究一些影像辨識的互動。看到影像辨識的關鍵字就會想到 “opencv"。於是上網找了一下其他人都用哪一套。不過後來發現這一套最新的版本 2.0 似乎有半年沒更新了,且實作不知道完不完全,所以想說再找找其他的。後來找到了這個 javacv 。 看起來實作很完全的樣子,於是就準備來把它接上去。不過目前的計畫是會再包裹一下,不然要偵測一下人臉要寫個七八行額外設定實在太麻煩了(可以有預設值阿~~~~)。

題外話:

我越來越覺得 processing or openframework   的設計很不錯(尤其是processing),一方面簡化了難度一方面還可以使用原生語言的lib。openframework簡化的倒是還好就是了。

用eclipse寫範例程式的時候都沒問題,準備接上去的時候一直出錯。

首先是找不到動態連結檔,dylib,後來發現因為javacv把dylib包在 javacv-macosx-x86_64.jar裡面,而processing 不吃(?)所以才會找不到。這邊的解法就是把javacv-macosx-x86_64.jar unzip 把裡面的dylib 都拿到code/

事情還沒完阿,這樣是找到了,但是接下來的錯誤就令我摸不著頭緒,出現了

java.lang.UnsatisfiedLinkError:     cv_test/processing/face/code/libjniopencv_core.dylib:  no suitable image found.  Did find: cv_test/processing/face/code/libjniopencv_core.dylib: mach-o, but wrong architecture

把關鍵字丟到網路上也沒啥結果,看到wrong architecture 想到的就是  x86 & 64的問題,所以先來確認一下 libjniopencv_core.dylib 這個是不是64bit的lib(官網上是這樣寫啦 ,但還是可以來看一下)。只要在終端機打上 : file libjniopencv_core.dylib  就會出現相關訊息如下:

libjniopencv_core.dylib: Mach-O 64-bit dynamically linked shared library x86_64

所以這邊應該就是確定了,接下來就是我懷疑 processing 叫程式的時候跑的是32bit 模式( 是說 這一定的吧 懷疑個頭…orz),所以我做了兩個測試:

1. 透過eclipse 寫一個獨立執行的  processing程式(就是  import processing.core & extends PApplet),結果可以執行!!

2. 在processing 執行該程式的時候去 ps -ef | grep java 就會看到

/usr/bin/java -d32 -Xrunjdwp:transport….

看到-d32  就確定了….。  我想可能可以避開的方法有幾個:

1.用其他編輯器寫,不要使用processing自帶的ide

2.重編 javacv 產生出  for mac_32的版本

3. 重編 processing

第一個應該是目前最快最方便的方法。第二個的話,目前…javacv的文件很缺乏,我看不太懂….  怎麼編譯….(弱!!),且這麼耗運算量的東西應該還是用64bit的會比較快吧。第三個倒是還算簡單,只是說你要用你自編的processing 。來描述一下怎麼做。

首先先到processing 的google code官方網站把原始碼給checkout下來。透過終端機下的 ack(ack-grep)指令來找一下 d32出現在哪邊,發現是在  processing/app/src/processing/mode/java/runner/Runner.java  的第 289行附近  :

 if (System.getProperty("os.version").startsWith("10.4")) {
        // -d32 not understood by 10.4 (and not needed)
        commandArgs =
          "java -Xrunjdwp:transport=dt_socket,address=" + addr + ",suspend=y ";
      } else {
        commandArgs =
//          "java -Xrunjdwp:transport=dt_socket,address=" + addr + ",suspend=y ";
           "java -d32 -Xrunjdwp:transport=dt_socket,address=" + addr + ",suspend=y ";
      }</pre>

說也奇怪,不知道為什麼mac才給定 -d32  ,而且上面註解掉的還有不給的版本(?),回去翻找 svn上的紀錄,發現一開始就這樣了 @@ 。好吧不管它,接著我們就把這個參數給拿掉 。進入  build/ 鍵入 ant run 即可(這樣多好編阿!!!)。 完成後的這個版本就可以直接執行無誤了。

總結一下在mac這樣搭配的時候要做的事有:

1. 把 javacv-macosx-x86_64.jar給解開,把裡面的 .dylib放到code/

2. 用外部的ide撰寫程式 或是重新編譯  processing

3. 完成!!

 

update:

改過的processing會無法使用 open kinect喔!!  不過嘛…   javacv整合了 kinect ,所以可以直接取用影像,但是就不知道骨架怎麼接起來了。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s