剛剛試寫了一個OpenCV的視訊程式...感覺還蠻好玩的...晚一點再來搞其他飛機XD

#include
#include "WebCam.h"
#include
#include
#include

int main() {
    CvCapture *capture0;
    IplImage *frame0;
    capture0 =cvCaptureFromCAM(0);
    cvNamedWindow("Webcam0",1);
    while(1) {
        frame0 = cvQueryFrame(capture0);
        cvShowImage("Webcam0",frame0);

        if(cvWaitKey(10)>=0) {
            break;
        }//end if
    }//end while
    cvReleaseCapture(&capture0);
    cvDestroyWindow("Webcam0");
}//end main

執行畫面:



09/02/02 update:
從上次這支C語言寫完以後(其實不難),就一直在嘗試如何用JAVA透過JNI來呼叫這支程式...今天,總算找到方法了!!
Java code:

class WebCam {
    public native void startWebCam();

    static {
        System.loadLibrary("webcam");
    }

    public static void main(String[] args) {
        System.out.println("Start the WebCam......");
        new WebCam().startWebCam();
    }
}

.h檔:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class WebCam */

#ifndef _Included_WebCam
#define _Included_WebCam
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     WebCam
 * Method:    startWebCam
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_WebCam_startWebCam
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

C code:

#include
#include "WebCam.h"
#include
#include
#include

JNIEXPORT void JNICALL
Java_WebCam_startWebCam (JNIEnv *env, jobject obj){
    CvCapture *capture0;
    IplImage *frame0;
    capture0 =cvCaptureFromCAM(0);
    cvNamedWindow("Webcam0",1);
    while(1) {
        frame0 = cvQueryFrame(capture0);
        cvShowImage("Webcam0",frame0);

        if(cvWaitKey(10)>=0) {
            break;
        }//end if
    }//end while
    cvReleaseCapture(&capture0);
    cvDestroyWindow("Webcam0");
}//end main

由於jni的編譯過程中,要先建立一個*.o的Object file然後在建立一個*.so的libaray檔...但又偏偏compile的過程中要含入OpenCV的libaray檔...

我測試過不少指令...應該說是對GCC不熟吧,所以就只有一直找辦法了...

# gcc -O2 -c -nostartfiles -fPIC -I/home/yuru/jdk1.6.0_07/include/ -I/home/yuru/jdk1.6.0_07/include/linux/ webcam.c `pkg-config --cflags opencv` `pkg-config --libs opencv`
有沒有那麼長的指令阿...嚇死我的毛了...

# gcc webcam.c -o webcam `pkg-config --cflags opencv` `pkg-config --libs opencv`
不對阿...在JNI下webcam.c並沒有main阿!!

正確的指令流程為:
1. 先compile並且導入OpenCV的標頭檔:

# gcc -nostartfiles -c webcam.c -fPIC -I/home/yuru/jdk1.6.0_07/include -I/home/yuru/jdk1.6.0_07/include/linux -I /usr/include/opencv/

2. 接著在建立libary的時候將OpenCV連結起來:

# gcc -shared -o libwebcam.so webcam.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

3. 執行class檔的時候將*.so檔也呼叫進來:

# LD_LIBRARY_PATH=`./libwebcam.so` java WebCam

嘿嘿...成功了...今晚總算可以好好睡一覺了!!

而如果有重新compile java檔的話,要記得連帶*.h檔也要重建,這樣才可以正常執行!!

# javac WebCam.java
# javah -jni WebCam
# LD_LIBRARY_PATH=`./libwebcam.so` java WebCam


參考資料:
1. 建立C函式庫及使用JNI寫程式 (繁中)
2. 用Java來和C做溝通的介面 - JNI (繁中)
3. GCC online documents (Link-options) (英)
4. Creating a shared and static library with the gnu compiler [gcc] (英)

09/02/04 update:
昨天宿醉了一整天,頭也痛了一整天...今天再看了一次金門的留言,想了一下,朝JMF的方向去找...這也意味著...有可能要跟OpenCV say bye bye了...(操! 又做白工了!)

看了Sun有關RTP(Real-Time Transport Protocol)的範例程式,雖然說之前就有試過,但今天仔細的一瞧...靠!! 沒有說明在Ubuntu下要怎麼驅動視訊...白搭了嘛!!

看來得在google撈撈看有沒有什麼鬼可以再試試看...

參考資料:
1. JMF 2.1.1 Solutions (英)

090206 00:12 update:
今天從下午六點開始試怎麼樣用JMF開啟視訊...試了一個晚上,從原本以為是裝置宣告的問題,到現在感覺是筆電的Driver的問題...

系統很不給面子的一直給我這樣的訊息:

java.lang.Error: Can't open video card 0
java.lang.Error: Can't open video card 1
java.lang.Error: Can't open video card 2
java.lang.Error: Can't open video card 3
java.lang.Error: Can't open video card 4
java.lang.Error: Can't open video card 5
java.lang.Error: Can't open video card 6
java.lang.Error: Can't open video card 7
java.lang.Error: Can't open video card 8
java.lang.Error: Can't open video card 9

明明v4l-info就有資訊阿!! 用OpenCV就開的了阿...為什麼JMF開不了?

難道真的是像我現在想到的Driver的問題嗎? 或許是吧...咪的...Toshiba A200為啥只出Vista的Driver...操...

或許還有幾個方法...要嘛,就查OpenCV的source code看是怎麼開啟視訊...要嘛,就再另一台Ubuntu OS的電腦裡外接一個視訊,然後再安裝JMF,看有沒有辦法讓視訊跑出來...

今天就先到這裡吧,晚了,該下班了。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 YuRu 的頭像
    YuRu

    YuRu's Life

    YuRu 發表在 痞客邦 留言(3) 人氣()