剛剛試寫了一個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,看有沒有辦法讓視訊跑出來...
今天就先到這裡吧,晚了,該下班了。
留言列表