利用OK6410與OV9650搭建的在yeelink平臺上搭建的視訊監控平臺
硬體環境:
飛凌OK6410開發板
OV9650攝像頭
目標要求:
通過開發板平臺,上傳攝像頭採集的影象。
步驟:
1.開發板驅動攝像頭顯示;
2.搭建web伺服器,通過瀏覽器檢視攝像頭影象;
3.抓取網頁影象
4.上傳至yeelink
5.通過motion軟體包實現影象的監控
系統硬體圖,有圖有真相:
參考資料
1.huawei hg255d(openwrt)+logitech c270+ wget&http-post 上傳yeelink
http://bbs.yeelink.net/thread-188-1-1.html
2.影象偵測:探測運動的軟體包motion
http://skpsun.blog.163.com/blog/static/27600552009121109154/
3.傳送影象:linux下使用sendmail傳送帶附件的郵件
http://jamesbond0479.blog.163.com/blog/static/241475820115229336243/
步驟1
【問題1】
燒寫如官方提供的uboot、zImage、rootfs.yaffs2,然後使用#testcamera命令測試攝像頭,螢幕沒有反應,列印訊息如下:
[[email protected]]# ./testcamera
Start Main
already open the devicise codec
Before openning FB
VIDIOC_S_FMT is c0cc5605
VIDIOC_STREAMON is 40045612
start to get pic 0
而且點選QT介面下的照相機,提示資訊no camera。
【猜想】
是不是PIC匯流排沒有在核心勾選?
│ Location: │
│ -> Device Drivers │
│ -> Staging drivers (STAGING [=n]) │
│ -> Data acquisition support (comedi) (COMEDI [=n]) │
│ -> Comedi PCI drivers (COMEDI_PCI_DRIVERS [=n])
Location: │
│ -> Device Drivers │
│ -> HID Devices (HID_SUPPORT [=y]) │
│ -> Special HID drivers │
│ -> PicoLCD (graphic version) (HID_PICOLCD [=n])
勾選後重新編譯生成zImage。
【問題1解決】
核心支援PCI,只不過光碟給的燒寫檔案有問題,其中,zImage需要換成最新的OK6410-B的燒寫檔案,網址如下:
效果是輸入
#testcamera,LCD有顯示,不過LCD效果很不好。
LCD顯示效果:
LCD上部即為攝像頭的影象,QT裡的測試程式沒有編寫好,不過至少攝像頭能用了。
開發環境:
主機:VMware+ubuntu
FS:nfs
nfs的配置過程及注意事項見:
步驟1基本完成,繼續步驟2的工作
步驟2
想複雜了,在開發板端構建web伺服器沒有什麼意義,想要外網能夠訪問,就必須藉助於具有外網IP與內網IP的裝置,在開發板上搭建web伺服器只能夠自娛自樂一下。將攝像頭採集的頭像釋出到類似yeelink的平臺上,其實只需要將影象打包,然後呼叫平臺的API即可,所以說這一步看似必要,其實是雞肋,另外motion獲取影象並且傳送郵件,這個擴充套件功能能夠實現真是極好的了,好了,可以洗洗睡覺了,可惜宿舍停水,熱水腳都沒得洗,悲催。
開發板通過網路上傳影象的基本步驟是:
開發板----wget----->影象-------curl-------->POST至Yeelink平臺
主機中,通過VMware建立了ubuntu系統,在ubuntu下測試使用crul來向yeelink平臺上傳一幅位於ubuntu下的影象。
1.進入yeelink平臺,建立裝置PostImageTestDevice,建立影象型感測器ImageTest,建立ImageTest後會生成CURL可以使用的網址:
定義CURL命令格式:
參看
請求例項 (運用curl):
curl --request POST --data-binary @datafile.jpg --header "U-ApiKey: YOUR_API_KEY_HERE" http://api.yeelink.net/v1.0/device/12/sensor/3/photos
需要在HTTP Header中增加API Key來授權寫入操作, 具體請參照API
Key. 支援一次傳送一幅影象資料.Note: 目前限定相鄰影象資料上傳間隔須大於等於10s, 過於頻繁的請求會收到406 Response.
參照API的文件,定義上傳VMWAREubuntu下/monitor/hero.jpg檔案至yeelink平臺,新建上傳命令檔案:/monitor/curl-test,主要引數為:上傳圖片、資料格式、U-ApiKey、感測器網址。
curl --request POST --data-binary @/monitor/hero.jpg --header "U-ApiKey:
YOUR_API_KEY_HERE" http://api.yeelink.net/v1.0/device/7811/sensor/12369/photos
在ubuntu安裝CURL:
#apt-get install curl
執行curl-test
#./curl-test
效果:
nice!
下面考慮的是如何獲得感測器的影象
2014-02-24
今天弄了一天,飛凌OV9650攝像頭通用性不好,本以為只是LCD顯示問題,但是自帶的測試程式的將VGA轉存為jpg檔案的函式並不能夠通過編譯,此路不通咱們換一條路,準備走安裝mjpg-STRAMER的老路,可是當mjpg-STREAMER安裝上後,根本不能夠利用攝像頭通過web伺服器釋出影象,在此估計是攝像頭的通用效能不好,畢竟不是USB的,還是MARK一下,製作OK6410相容的mjpg-STREAMER的方法,詳情請猛點如下網址:
2014-02-25
還是放棄原來的的OV9650,向同學借了一個攝像頭,發現能用,那怎麼才能知道攝像頭是符合UVC標準,還有測試攝像頭呢?
請猛戳如下網址:
攝像頭能用,本來luvcview支援兩種格式的顯示1.jpg格式2.yuv格式,此攝像頭只支援yuv格式,這就導致了mjpeg-STREAMER不能用了,土辦法,首先使用攝像頭拍照,yuv格式拍照的照片格式為*.pnm,然後使用圖片格式工具netpbm將pnm格式圖片轉換為jpg格式,當然這一部分是在ubuntu下操作的啦。
1.可以使用在資料光碟中的路徑為:Linux-3.0.1\apptest\攝像頭測試\USB攝像頭\USBCamera- linux+android\linux3.0.1系統下-2012-07-05/luvcview-2012-07-05.tar,原始碼預設是不能夠拍照的,但是具有拍照功能,修改原始碼luvcview.c中:
在if (videoIn->getPict) 前新增程式碼
videoIn->getPict=1;
代表使能拍照功能,重新編譯後,將執行檔案luvcview拷貝至開發板的根目錄下,然後執行:
# ./luvcview -d /dev/video2 -f yuv
開發板將拍的照片存放至與luvcview同樣的目錄路徑下,也就是根目錄下,副檔名為.pnm
2.問題在於yeelink平臺並不支援pnm格式的圖片,因此需要轉換,暫時開發板上是搞不定了的,只能依靠強大的ubuntu了,百度了一下,發現一款圖片轉換工具netpbm,能夠將pnm等多種圖片格式轉換為jpg,在主機上安裝netpbm:
#sudo apt-get install netpbm
轉換圖片,命令格式為:
#pnmtojpeg -quality=60 foo.ppm > foo.jpg
命令可以參考
3.然後使用主機ubuntu中的CURL工具上傳至yeelink平臺。
這一套是成功了,但是問題是開發板對於主機的依賴太大,圖片轉換和上傳圖片都是ubuntu完成的,OK6410完成的僅僅是驅動攝像頭,然後拍照。
在OK6410需要完善的工作是:
1.搭建類似CURL能夠HTTP-POST資料的工具;
2.得到jpg格式的圖片,要麼換攝像頭,要麼移植圖片轉換工具。
今天的效果如下:
後面要做的工作是:
1.測試攝像頭是否合格,使用命令:
#luvcview -L -d /dev/video2
# luvcview -d /dev/video2 -f jpg -s 320x240
2.mjpeg-STREAMER能顧正常使用:
#mjpg_streamer -i "/mjpeg/input_uvc.so -d /dev/video2" -o "/mjpeg/output_http.so"
用火狐瀏覽器開啟一個網頁輸入下面地址就能夠看到一個視訊(開發板的IP為192.168.1.100):
http://192.168.1.100:8080/?action=stream
開啟一個網頁輸入下面地址就能夠看到一個靜態圖片:
http://192.168.1.100:8080/?action=snapshot
3.更新wget命令或者安裝CURL命令
4.上傳圖片
突然想起來,那個mjpeg-TREAMER的庫的名字就叫做:input_uvc.so,怎麼可能不能夠輸入yuv模式的圖片,然後想了一下,報錯是由於ERROR: could not find input plugin,也就是找不到入口,應該就是入口庫,然後試著把所有的庫拷貝至/usr/lib,然後再使用命令:
# mjpg_streamer -i "input_uvc.so -y -f 15 -r 320*240 -q 50 -d /dev/video2" -o "output_http.so -p 8080 -w /www/camwww"
然後就可以了啊!用火狐瀏覽器開啟,效果如下:
好了,上句命令參考了:
不過主要原因還是庫找不到,需要拷貝至指定資料夾下。
好了,OK6410開發板通過攝像頭,利用mjpeg-STREAMER搭建網頁視訊流,並且利用wget工具擷取視訊為圖片一條龍服務搭建完成,通過執行指令碼檔案getimage.sh,即可完成全套動作:
#! /bin/sh
mjpg_streamer -i "input_uvc.so -y -f 15 -r 320*240 -q 50 -d /dev/video2" -o "output_http.so -p 8080 -w /www/camwww" &
wget "http://192.168.1.100:8080/?action=snapshot" -O /test.jpg
注意第一句的&,此符號代表在後臺執行程式,第二句表示將視訊流擷取為test.pg的圖片,整套系統的基本版剩下的任務是通過利用類似CURL的服務將圖片檔案傳輸至yeelink。
今天基本上完工了,晚上將curl安裝至NFS下,nice。
首先需要交叉編譯,然後安裝,具體的編譯方法可以猛戳如下連線:
安裝好curl後就只需要POST-DATA了,在開發板中輸入如下命令:
curl --request POST --data-binary @/hero.jpg --header "U-ApiKey: YOUR_KEY" http://api.yeelink.net/v1.0/device/7811/sensor/12369/photos
就會出現如下驚喜的結果:
接下來只需要將以上內容整合,優化上傳圖片了,NICE,man!
2014-02-27
接下來寫shell指令碼檔案了,將下載圖片與上傳圖片的功能寫入update shell中,並且向crontab新增計劃任務,每格一定的時間wget image,並且curl圖片之yeelink平臺.
1.首先需要測試crontab任務,主要新增的是:每隔一定時間,執行一次update,具體配置busybox下crontab任務,參見下文,請猛戳如下網址:
2.編寫shell指令碼.
2.1首先判斷mjpeg-STREAMER是否已經啟動,若未啟動,則執行啟動命令,若啟動完成,則繼續執行2.2;
2.2判斷是否執行成功,成功則執行2.3,失敗則退出;
2.3使用wget命令得到image.jpg檔案,若成功,則繼續2.4,若失敗則退出;
2.4使用curl命令將圖片POST至yeelink平臺,成功與失敗均推出程式。
所有的執行結果均記錄如updatelog日誌檔案。
今天初步完成了基本功能,邏輯判斷內容還沒有新增,有待完善,看到自己攝像頭拍攝的圖片在yeelink上成功顯示,真是倍兒爽啊!