剛剛試寫了一個OpenCV的視訊程式...感覺還蠻好玩的...晚一點再來搞其他飛機XD
執行畫面:
09/02/02 update:
從上次這支C語言寫完以後(其實不難),就一直在嘗試如何用JAVA透過JNI來呼叫這支程式...今天,總算找到方法了!!
Java code:
.h檔:
C code:
由於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的標頭檔:
2. 接著在建立libary的時候將OpenCV連結起來:
3. 執行class檔的時候將*.so檔也呼叫進來:
嘿嘿...成功了...今晚總算可以好好睡一覺了!!
而如果有重新compile java檔的話,要記得連帶*.h檔也要重建,這樣才可以正常執行!!
參考資料:
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的問題...
系統很不給面子的一直給我這樣的訊息:
明明v4l-info就有資訊阿!! 用OpenCV就開的了阿...為什麼JMF開不了?
難道真的是像我現在想到的Driver的問題嗎? 或許是吧...咪的...Toshiba A200為啥只出Vista的Driver...操...
或許還有幾個方法...要嘛,就查OpenCV的source code看是怎麼開啟視訊...要嘛,就再另一台Ubuntu OS的電腦裡外接一個視訊,然後再安裝JMF,看有沒有辦法讓視訊跑出來...
今天就先到這裡吧,晚了,該下班了。
| #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,看有沒有辦法讓視訊跑出來...
今天就先到這裡吧,晚了,該下班了。
文章標籤
全站熱搜

哈哈 我上研究所就狂寫OpenCV了 = = 不過為什麼不用JMF開視訊就好!?
這個問題,就牽涉到驅動程式了... JMF在開視訊的時候要指定裝置...在Windows下很好指定,但在Ubuntu下...沒那麼簡單了...或許是我還沒找到更好的方法啦@@" 因為程式都是在Ubuntu下跑,所以都想說用JNI呼叫OpenCV...我看過一些做影像處理的碩士論文也是如此作法...
好久沒看到阿入的廬山真面目了 有轉大人的感覺喔!
展老大,您過獎了~這是要轉大人轉不過的小毛頭XD 話說~展老大您現在在哪高就阿@@?
喔喔 原來如此 都怪我跟Linux比較沒往來XD
結果現在要做RTP,還是要先看看JMF在Ubuntu下要怎麼跑...今天試了一下...還沒找到方法。 不然就要自己用C或是JAVA寫串流傳輸了...ˊˋ open source的東西還是有一些瓶頸...