2012年10月9日 星期二

How to use javacv on Win7 with Eclipse IDE

自從我接觸電腦視覺、數位影像處理以來

只要碰到OpenCV有關的東西頭就很痛

這個開源函式庫最討人厭的地方就是...

每個版本的資料夾路徑都長不一樣

每個版本的安裝方法都不盡相同

更別說每個 IDE 的連接方式了(其實應該差不多,但你知道每個IDE要叫出連接的選項總是放在不同地方)

一般開發openCV國內外大多推薦Visual Studio

逍遙文工作室 有針對各種不同版本做很詳細的安裝說明

但我們今天要講的是javacv

javacv是甚麼呢?

因為opencv這套函式庫是給C or C++用的

也就是說為了要把這麼給力的函式庫讓java也能用

故有人就弄出javacv這個東西

根據小弟安裝經驗

版本問題貌似解決了但實際上不然

因為你灌的javacv版本必須跟你的openCV完全match

不然就會跟小弟一開始一樣一直噴出錯誤訊息甚麼Unsatisfied Linked Error....

接下來是圖文教學,希望看過之後能幫助更多人省下時間(開發者最痛恨的事情我想不是debug就是開發環境的建置)



0.現在假設你已經灌好openCV了,在 Visual Studio上用得好好的,突然被告知要用java開發一樣的東西,短時間內你不可能自己寫出一套java版的影像視訊函式庫(如果你真的幾天之內能生出來那這篇文對你來說就是廢文可以甭看了),這時候你就需要這玩意兒了

1.重要:確定你的openCV版本下載適當的javacv版本

openCV 2.4請到 http://code.google.com/p/javacv/downloads/list 下載 2012/7/21所釋出的版本,binary版就夠了,除非你要改他的source code那就載src版

openCV 2.3 請下載 http://javacv.googlecode.com/files/javacv-bin-20110705.zip

下載完成解壓縮放到你喜歡的地方

2.打開 Eclipse,新建一個專案。沒有意外地建置完成,在專案名稱處按右鍵->Build Path->Add External Archives



3.把javacv解壓縮資料夾內的jar檔通通加進來


此時該專案的Referenced Libraries就可以看到剛那些加入的jar檔了

4.接下來測試是否安裝成功。在該專案內創建兩個class,GrabberShow.java 以及 TestGrabber.java,code如下

---------------------------------------------------------------------------------------------------------

GrabberShow.java:

import static com.googlecode.javacv.cpp.opencv_core.cvFlip;
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.VideoInputFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import java.awt.image.BufferedImage;
public class GrabberShow implements Runnable{
//final int INTERVAL=1000;///you may use interval
    IplImage image;
    CanvasFrame canvas = new CanvasFrame("Web Cam");
    public GrabberShow() {
        canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    }
    public void run() {
        FrameGrabber grabber = new VideoInputFrameGrabber(0); // 1 for next camera
        BufferedImage  currentFrame;
        int i=0;
        try {
            grabber.start();
            IplImage img;
            while (true) {
                img = grabber.grab();
                if (img != null) {
                    cvFlip(img, img, 1);// l-r = 90_degrees_steps_anti_clockwise
                    cvSaveImage((i++)+"-aa.jpg", img);
                    currentFrame=img.getBufferedImage(); //if transforming to java BufferedImage is required
                    canvas.showImage(img);
                }
                 //Thread.sleep(INTERVAL);
            }
        } catch (Exception e) {
        }
    }
}

---------------------------------------------------------------------------------------------------------

TestGrabber.java:(main)

public class TestGrabber {
public static void main(String[] args) {
       GrabberShow gs = new GrabberShow();
       Thread th = new Thread(gs);
       th.start();
   }
}

----------------------------------------------------------------------------------------------------------


5.Run it! 成功的話會看到視訊畫面,你可以對著畫面自High一番然後大叫:我終於搞定javacv了



祝coding順利

6 則留言:

  1. 我也有遇到相同的問題,但是我還沒試過用你的方法,我是靠http://code.google.com/p/javacv/wiki/Windows7AndOpenCV 解決的

    回覆刪除
    回覆
    1. 我連進去才發現這篇我有看過,但因為我不是用2.4所以不適用

      刪除
  2. 您好,我執行後發現jniopencv_core.dll: Can't find dependent libraries
    好像我的javacpp有問題,請問一下這要怎麼解決?

    勞煩之處,感謝

    回覆刪除
  3. 環境變數沒問題,確認過,不過沒關係。
    我想請問OpenCV4Android這個用途是什麼(抱歉,新手)?
    如果我想使用OpenCV的FAST detction,該如何使用呢?
    謝謝站主。

    回覆刪除
    回覆
    1. 嗨你好,抱歉這麼晚回你。4ANDROID顧名思義就是OPENCV給ANDROID用的lib,另外還有給iOS、macOS、linux的。
      我查了一下FAST detection感覺跟我用過的SURF跟SIFT相差不大,我有實際測過的code(2.4.5)如果您需要我可以寄給你

      刪除