版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 嵌入式課程設(shè)計報告</b></p><p><b> 一、課程設(shè)計目的</b></p><p> 1.1 掌握linux開發(fā)環(huán)境的搭建; </p><p> 1.2鞏固嵌入式交叉編譯的開發(fā)思想;</p><p> 1.3掌握嵌入式GUI軟件設(shè)計技。,.
2、;</p><p><b> 課程設(shè)計要求</b></p><p> 輸入信號為 1 路 AV 視頻信號,要求系統(tǒng)能對 1 路輸入信號進(jìn)行實時采集,數(shù)字化 處理,壓縮,存儲,要保證一定的錄像質(zhì)量. 根據(jù)設(shè)計題目的要求,選擇確定 ARM 芯片型號,視頻采集芯片型號,完成系統(tǒng)硬件設(shè) 計和程序設(shè)計.</p><p><b> 課程設(shè)計
3、內(nèi)容</b></p><p> 設(shè)計原理 ARM10 系列微處理器為低功耗的 32 位 RISC 處理器,最適合用于對價位和功耗要 求較高的消費類應(yīng)用.</p><p> ARM10 系列微處理器的主要應(yīng)用領(lǐng)域為:工業(yè)控制,Internet 設(shè)備,調(diào)制解 調(diào)器設(shè)備,移動電話等多種多媒體和嵌入式應(yīng)用. </p><p> 視頻監(jiān)控系統(tǒng)總體設(shè)計
4、首先需要對系統(tǒng)進(jìn)行總體規(guī)劃,將系統(tǒng)劃分成幾個功能模塊,確定各個模塊的實現(xiàn) 方法.整個視頻監(jiān)控系統(tǒng)采用 C/S 結(jié)構(gòu),從主體上分為兩部分:服務(wù)器端和客戶端.服 務(wù)器端主要包括 S3C4510 平臺上運行的采集,壓縮,傳輸程序,客戶端是 PC 機上運行 的接收,解壓,回放程序.視頻監(jiān)控終端從攝像頭捕獲實時的視頻信息,壓縮之后通過 以太網(wǎng)傳輸?shù)揭曨l監(jiān)控服務(wù)器上.</p><p> 視頻圖像采集和打包發(fā)送在服務(wù)器端完成
5、,圖像的接收 解包和回放將在客戶端完成. 采集圖像 數(shù)據(jù)壓縮 打包發(fā)送 接收</p><p> 系統(tǒng)的硬件設(shè)計 系統(tǒng)采用模塊化設(shè)計方案,主要包括以下幾個模塊:主控制器模塊,儲存電路模塊, 外圍接口電路模塊,電源和復(fù)位電路,</p><p> S3C4510 主控器模塊 </p><p> 主控器模塊是整個系統(tǒng)的核心,采用的 S3C4510B 處理器.Sam
6、sung 公司的 S3C45 10B 是基于以太網(wǎng)應(yīng)用系統(tǒng)的高性價比 16/32 位 RISC 微控制器,內(nèi)含一個由 ARM 公司設(shè)計的 16/32 位 ARM7TDMI RISC 處理器核,ARM7TDMI 為低功耗,高性能的 16/32 核,</p><p><b> 系統(tǒng)存儲電路模塊 </b></p><p> 主控器還需一些外圍存儲單元如 Nand Fla
7、sh,和 SDRAM.Nand Flash 中包含 Lin ux 的 Bootloader,系統(tǒng)內(nèi)核,文件系統(tǒng),應(yīng)用程序以及環(huán)境變量和系統(tǒng)配置文件等;S DRAM 讀寫速度快,系統(tǒng)運行時把它作為內(nèi)存單元使用. </p><p><b> 外圍電路模塊 </b></p><p> 外圍電路主要是以下幾個電路,復(fù)位電路圖,電源電路圖以及 JTAG 電路,</p&
8、gt;<p> 三、課程設(shè)計設(shè)備及工具</p><p> 硬件:UP-NETARM2410-S嵌入式實驗儀、PC機、ov511攝像頭;</p><p> 軟件:PC機操作系統(tǒng)REDHAT LINUX 9.0、MINICOM、AMR-LINUX開發(fā)環(huán)境。</p><p><b> 四、設(shè)計方案</b></p>
9、<p> 本次課程設(shè)計采用arm10開發(fā)平臺。該平臺采用Samsung公司的處理器S3C2410。該處理器內(nèi)部集成了ARM公司 ARM920T處理器核的32位微控制器,資源豐富,帶獨立的16KB的指令Cache和16KB數(shù)據(jù)Cache、LCD控制器、RAM控制器、NAND 閃存控制器、3路UART、4路DMA、4路帶PWM的Timer、并行I/O口、8路10位ADC、Touch Screen接口、I2C接口、I2S接口、2個
10、USB接口控制器、2路SPI,主頻最高可達(dá)203MHz。在處理器豐富資源的基礎(chǔ)上,還進(jìn)行了相關(guān)的配置和擴(kuò)展,平臺配置了16MB 16位的Flash和64MB 32位的SDRAM。通過以太網(wǎng)控制器芯片DM9000E擴(kuò)展了一個網(wǎng)口,另外引出了一個HOST USB接口。通過在USB接口上外接一個帶USB口的攝像頭,將采集到的視頻圖像數(shù)據(jù)放入輸入緩沖區(qū)中。然后,對緩沖區(qū)中的視頻數(shù)據(jù)進(jìn)行壓縮成幀,并把每一幀圖片在網(wǎng)頁中顯示出來,每秒鐘刷新兩次,得
11、到一個動態(tài)的視頻界面,然后通過局域網(wǎng)訪問該主機的網(wǎng)頁,得到網(wǎng)絡(luò)視頻信息。本次課程設(shè)計主要是完成得到視頻圖片及網(wǎng)頁刷新的過程。</p><p> 本次設(shè)計要求在局域網(wǎng)環(huán)境中進(jìn)行。</p><p><b> 五、開發(fā)環(huán)境配置</b></p><p> 5.1 攝像頭驅(qū)動加載</p><p> 在Linux下,設(shè)備驅(qū)動
12、程序可以看成Linux內(nèi)核與外部設(shè)備之間的接口。設(shè)備驅(qū)動程序向應(yīng)用程序屏蔽了硬件實現(xiàn)了的細(xì)節(jié),使得應(yīng)用程序可以像操作普通文件一樣來操作外部設(shè)備,可以使用和操作文件中相同的、標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口函數(shù)來完成對硬件設(shè)備的打開、關(guān)閉、讀寫和I/O控制操作,而驅(qū)動程序的主要任務(wù)也就是要實現(xiàn)這些系統(tǒng)調(diào)用函數(shù)。本系統(tǒng)平臺使用的嵌入式arm-Linux系統(tǒng)在內(nèi)核主要功能上與 Linux操作系統(tǒng)沒本質(zhì)區(qū)別。</p><p> Vi
13、deo4Linux(簡V4L)是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動,它為針對視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù),這些視頻設(shè)備包括現(xiàn)今市場上流行的TV卡、視頻捕捉卡和USB攝像頭等。</p><p> ov511的驅(qū)動,2.4的內(nèi)核中就有,所以我們只需重新編譯內(nèi)核,將下邊的選項都選上,然后重新燒寫內(nèi)核就可以了。也就是直接靜態(tài)加載。(1)在arm linux的kernel目錄下make menuconfig
14、。(2)首先(*)選擇Multimedia device->下的Video for linux。加載video4linux模塊,為視頻采集設(shè)備提供編程接口;(3)然后在usb support->目錄下(*)選擇support for usb和usb camera ov511 support。這使得在內(nèi)核中加入了對采用OV511接口芯片的USB數(shù)字?jǐn)z像頭的驅(qū)動支持。(4)保存配置退出。(5)make dep;make
15、zImage就生成了帶有ov511 驅(qū)動的內(nèi)核。接下來就通過uboot將內(nèi)核燒到flash里去。這時你將攝像頭插上,系統(tǒng)就會提示發(fā)現(xiàn)攝像頭-ov511+,這說明驅(qū)動正常。:-),驅(qū)動加載就成功了。</p><p> 5.2 安裝jpeg庫</p><p> 在地址ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz中下載jpeg庫的壓縮包
16、。# tar -zxvf jpegsrc.v6b.tar.gz //解壓庫文件# cd jpeg-6b# ./configure --prefix=/usr/local/jpeg6--enable-shared //生成MAKEFILE文件</p><p> # make //編譯安裝文件</p><p> #mkdir /usr/local/jpeg6&
17、lt;/p><p> #mkdir /usr/local/jpeg6/include</p><p> #mkdir /usr/local/jpeg</p><p> #mkdir /usr/local/jpeg/lib</p><p> #mkdir /usr/local/jpeg/bin</p><p> #
18、mkdir /usr/local/jpeg/man</p><p> #mkdir /usr/local/jpeg/man/man1 //建立生成安裝文件的目錄</p><p> #make install -lib /生成安裝文件</p><p> #make install //開始安裝文件</p><p>&
19、lt;b> 設(shè)計過程</b></p><p><b> 6.1 硬件設(shè)計</b></p><p> 系統(tǒng)的主體設(shè)計思想是將視頻前端和嵌入式Web服務(wù)器整合在一起,攝像頭通過USB接口和嵌入式系統(tǒng)板的USB HOST相連,攝像頭采集來的視頻信號經(jīng)過壓縮后,通過內(nèi)部總線傳送到內(nèi)置的Web服務(wù)器,客戶端采用瀏覽器/服務(wù)器結(jié)構(gòu)(即B/S結(jié)構(gòu)),可以通過
20、IE瀏覽器訪問視頻Web服務(wù)器,以便查看所監(jiān)控的視頻畫面,而且,用戶還可以控制平臺對鏡頭的動作或?qū)ο到y(tǒng)進(jìn)行配置控制。</p><p> 網(wǎng)絡(luò)視頻采集系統(tǒng)是由視頻監(jiān)控終端和視頻監(jiān)控中心組成,終端使用嵌入式系統(tǒng)加上USB攝像頭,在Linux操作系統(tǒng)上運行USB攝像頭的驅(qū)動和相應(yīng)的視頻采集處理傳輸程序,得到視頻監(jiān)控畫面,并畫面通過網(wǎng)絡(luò)傳輸,監(jiān)控中心運行監(jiān)控軟件端,通過Internet瀏覽器來瀏覽終端送來的監(jiān)控畫面,其
21、硬件連接圖如下所示:</p><p> 網(wǎng)絡(luò)視頻采集硬件連接圖</p><p> 從圖中可以看出,PC機部分可以直接采用IE瀏覽器,不需要在PC機上運行其他的軟件,主要設(shè)計工作是開發(fā)板端的設(shè)計。視頻監(jiān)控終端主要有兩個部分組成,硬件部分包括攝像頭和開發(fā)平臺的選擇;軟件部分包括系統(tǒng)級軟件(Boot Loader,嵌入式操作系統(tǒng),USB驅(qū)動程序)與用戶級軟件(應(yīng)用程序)。</p>
22、<p><b> 6.2 軟件設(shè)計</b></p><p> Video4linux為應(yīng)用程序提供了一系列的接口函數(shù),通過這些函數(shù),可以執(zhí)行打開、讀寫、關(guān)閉等基本操作。設(shè)備驅(qū)動提供了read、write、open、close等函數(shù)的具體實現(xiàn),在內(nèi)核這些函數(shù)都可以調(diào)用。視頻采集流程圖如下所示:</p><p><b> 視頻采集流程圖<
23、;/b></p><p> 利用V4L編寫的視頻采集程序重要代碼如下,下列代碼包含采集編碼程序一些關(guān)鍵函數(shù)。</p><p> 程序中定義的數(shù)據(jù)結(jié)構(gòu)</p><p> struct _v4l_struct </p><p><b> { </b></p><p> int fd;
24、 // 保存打開視頻文件的設(shè)備描述符 </p><p> struct video_capability capability;</p><p> struct video_picture picture; </p><p> struct video_mmap mmap; </p><p> stru
25、ct video_mbuf mbuf; </p><p> unsigned char *map; // 用于指向圖像數(shù)據(jù)的指針 </p><p> int frame_current; </p><p> int frame_using[VIDEO_MAX_FRAME]; // 這兩個變量用于雙緩沖 </p><p> }
26、; typedef struct _v4l_struct v4l_device; </p><p> 這些數(shù)據(jù)結(jié)構(gòu)都是由Video4Linux支持的,它們的用途如下:</p><p> *video_capability包含攝像頭的基本信息,例如設(shè)備名稱、支持的最大最小分辨率、信號源信息等;</p><p> *voide_picture包含設(shè)備采集圖像的各種
27、屬性,如brightness(亮度)、hue(色調(diào))、contrast(對比度)、whiteness(色度)、color(深度)等;</p><p> *video_mmap用于內(nèi)存映射;</p><p> *voido_mbuf利用mmap進(jìn)行映射的幀信息,實際上是輸入到攝像頭存儲器緩沖中的幀信息,包括size(幀的大?。?、frames(最多支持的幀數(shù))、offsets(每幀相對基址
28、的偏移)。</p><p> 程序中用到的主要系統(tǒng)調(diào)用函數(shù)有:open("/dev/voideo0",int flags)、close(fd)、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void *start,size_tlength)和ioctl(int fd,int cmd,
29、…)。</p><p> 前面提到Linux系統(tǒng)中把設(shè)備看成設(shè)備文件,在用戶空間可以通過標(biāo)準(zhǔn)的I/O系統(tǒng)調(diào)用函數(shù)操作設(shè)備文件,從而達(dá)到與設(shè)備通信交互的目的。當(dāng)然,在設(shè)備驅(qū)動中要提供對這些函數(shù)的相應(yīng)支持。這里說明一下ioctl(int fd,int cmd,…)函數(shù),它在用戶程序中用來控制I/O通道,其中,fd代表設(shè)備文件描述符,cmd代表用戶程序?qū)υO(shè)備的控制命令,省略號一般是一個表示類型長度的參數(shù),也可沒有。&
30、lt;/p><p> ?。?)采集程序?qū)崿F(xiàn)過程</p><p> 首先打開視頻設(shè)備,攝像頭在系統(tǒng)中對應(yīng)的設(shè)備文件為/dev/video0,采用系統(tǒng)調(diào)用函數(shù)grab_fd =open ("/dev/video0",O_RDWR),grab_fd是設(shè)備打開后返回的文件描述符(打開錯誤返回-1),以后的系統(tǒng)調(diào)用函數(shù)就可使用它來對設(shè)備文件進(jìn)行操作了。接著,利用ioct1(grab
31、_fd,VIDIOCGCAP,&grab_cap)函數(shù)讀取struct video_capability中有關(guān)攝像頭的信息。該函數(shù)成功返回后,這些信息從內(nèi)核空間拷貝到用戶程序空間grab_cap各成員分量中,使用 printf函數(shù)就可得到各成員分量信息,例如printf("maxheight=%d",grab_fd.maxheight)獲得最大垂直分辨率的大小。不規(guī)則用ioct1(grab_fd,VIDIOC
32、GPICT,&grab_pic)函數(shù)讀取攝像頭緩沖中voideo_picture信息。在用戶空間程序中可以改變這些信息,具體方法為先給分量賦新值,再調(diào)用VIDIOCSPICT ioct1函數(shù),例如:</p><p> grab_fd.depth=3;</p><p> if(ioct1(grab_fd,VIDIOCSPICT,&grab_pic)<0)</p
33、><p> {perror("VIDIOCSPICT");return -1;};</p><p> 完成以上初始化設(shè)備工作后,就可以對視頻圖像截取了,有兩種方法:一種是read()直接讀?。涣硗庖环N mmap()內(nèi)存映射。Read ()通過內(nèi)核緩沖區(qū)來讀取數(shù)據(jù);而mmap()通過把設(shè)備文件映射到內(nèi)存中,繞過了內(nèi)核緩沖區(qū),最快的磁盤訪問往往還是慢于最慢的內(nèi)存訪問,所以m
34、map ()方式加速了I/O訪問。另外,mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一文件實現(xiàn)共享內(nèi)存,各進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,訪問時只需要使用指針而不用調(diào)用文件操作函數(shù)。因為mmap()的以上優(yōu)點,所以在程序?qū)崿F(xiàn)中采用了內(nèi)存映射方式,即mmap()方式。</p><p> 利用mmap()方式視頻裁取具體進(jìn)行操作如下。</p><p> ①先使用ioct1(grab
35、_fd,VIDIOCGMBUF,&grab_vm)函數(shù)獲得攝像頭存儲緩沖區(qū)的幀信息,之后修改voideo_mmap中的設(shè)置,例如重新設(shè)置圖像幀的垂直及水平分辨率、彩色顯示格式。可利用如下語句</p><p> grab_buf.height=240;</p><p> grab_buf.width=320; 字串8</p><p> grab_buf.
36、format=VIDEO_PALETTE_RGB24;</p><p> ?、诮又褦z像頭對應(yīng)的設(shè)備文件映射到內(nèi)存區(qū),具體使用grab_data=(unsigned char*) mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。這樣設(shè)備文件的內(nèi)容就映射到內(nèi)存區(qū),該映射內(nèi)容區(qū)可讀可寫并且不同進(jìn)程間可共享。該函數(shù)成功時返回映像內(nèi)存區(qū)的指
37、針,挫敗時返回值為-1。</p><p> 下面對單幀采集和連續(xù)幀采集進(jìn)行說明:</p><p> *單幀采集。在上面獲取的攝像頭存儲緩沖區(qū)幀信息中,最多可支持的幀數(shù)(frames的值)一般為兩幀。對于單幀采集只需設(shè)置 grab_buf.frame=0,即采集其中的第一幀,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf) 函數(shù),若調(diào)用成功,則激
38、活設(shè)備真正開始一幀圖像的截取,是非阻塞的。接著使用ioct1(grab_fd,VIDIOCSYNC,&frame) 函數(shù)判定該幀圖像是否截取完畢,成功返回表示截取完畢,之后就可把圖像數(shù)據(jù)保存成文件的形式。</p><p><b> 測試與實現(xiàn)</b></p><p> ?。?)仔細(xì)檢查設(shè)備的連接,打開電源;</p><p> (2)
39、在PC機上的瀏覽器中地址欄輸入開發(fā)板地址,網(wǎng)頁自動跳到開發(fā)板的首頁;</p><p> ?。?)在頁面上可見攝像頭采集到的視頻信息。</p><p> 經(jīng)驗證,本次設(shè)計基本達(dá)到設(shè)計要求。</p><p><b> 設(shè)計心得</b></p><p> 本次課程設(shè)計通過運用嵌入式技術(shù),圖形處理技術(shù)等,完成了網(wǎng)絡(luò)視頻的采
40、集過程,進(jìn)一步熟悉了交叉編譯的開發(fā)方法,在開發(fā)的過程中,遇到很多問題,如驅(qū)動無法加載,程序調(diào)試出錯等,通過重新編譯開發(fā)板內(nèi)核、安裝圖形處理庫等,解決了多個問題,在解決問題的過程中,我們對嵌入式的開發(fā)過程多了一些細(xì)節(jié)的認(rèn)識,為以后的持續(xù)學(xué)習(xí)鞏固了基礎(chǔ)。</p><p> 在設(shè)計過程中,我們分工合作,一起進(jìn)步,不只從理論上對嵌入式有了更深的認(rèn)識,同時從實踐中驗證了學(xué)習(xí)的理論知識,對嵌入式有了更深一步的認(rèn)識。<
41、/p><p><b> 源程序清單</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <sys/types.h></p><p> #include
42、 <sys/stat.h></p><p> #include <fcntl.h></p><p> #include <sys/ioctl.h></p><p> #include <sys/mman.h></p><p> #include <errno.h></p
43、><p> #include <linux/videodev.h></p><p> #include <jpeglib.h></p><p> #include <unistd.h></p><p> #include <math.h></p><p> #inc
44、lude <errno.h></p><p> #include <string.h></p><p> #include <signal.h></p><p> #include <pthread.h></p><p> #include <sys/time.h></
45、p><p> #include <sys/mman.h></p><p> #include <getopt.h></p><p> #define WIDTH 640</p><p> #define HEIGHT 480</p><p> #define DEFAULT_DEVICE
46、 "/dev/v4l/video1"</p><p> int write_jpeg(char *filename,unsigned char *buf,int quality,int width, int height, int gray)</p><p> {struct jpeg_compress_struct cinfo;</p><p&
47、gt; struct jpeg_error_mgr jerr;</p><p><b> FILE *fp;</b></p><p><b> int i;</b></p><p> unsigned char *line;</p><p> int line_length;</p&
48、gt;<p> if (NULL == (fp = fopen(filename,"w")))</p><p><b> {</b></p><p> fprintf(stderr,"grab: can't open %s: %s\n",filename,strerror(errno));</p
49、><p> return -1;</p><p><b> }</b></p><p> cinfo.err = jpeg_std_error(&jerr);</p><p> jpeg_create_compress(&cinfo);</p><p> jpeg_stdio
50、_dest(&cinfo, fp);</p><p> cinfo.image_width = width;</p><p> cinfo.image_height = height;</p><p> cinfo.input_components = gray ? 1: 3;</p><p> cinfo.in_color
51、_space = gray ? JCS_GRAYSCALE: JCS_RGB;</p><p> jpeg_set_defaults(&cinfo);</p><p> jpeg_set_quality(&cinfo, quality, TRUE);</p><p> jpeg_start_compress(&cinfo, TRUE);
52、</p><p> line_length = gray ? width : width * 3;</p><p> for (i = 0, line = buf; i < height; i++, line += line_length)</p><p> jpeg_write_scanlines(&cinfo, &line, 1);&
53、lt;/p><p> jpeg_finish_compress(&(cinfo));</p><p> jpeg_destroy_compress(&(cinfo));</p><p> fclose(fp);</p><p> ///////////////////////////////////////////////
54、//////////////////////</p><p> char fn1[30]="/var/www/pic001.jpg";</p><p> char fn2[30]="/var/www/pic002.jpg";</p><p> if (NULL == (fp = fopen(fn1,"r&quo
55、t;))){</p><p> fclose(fp);</p><p> remove(fn1);</p><p><b> }</b></p><p> rename(fn2,fn1);</p><p> ////////////////////////////////////////
56、/////////////////////////////</p><p><b> return 0;</b></p><p><b> }</b></p><p> //這個函數(shù)很通用,它的作用是把buf中的數(shù)據(jù)壓縮成jpeg格式。</p><p> struct _v4l_struct
57、 </p><p><b> { </b></p><p> int fd; // 保存打開視頻文件的設(shè)備描述符 </p><p> struct video_capability capability;</p><p> struct video_picture picture
58、; </p><p> struct video_mmap mmap; </p><p> struct video_mbuf mbuf; </p><p> unsigned char *map; // 用于指向圖像數(shù)據(jù)的指針 </p><p> int frame_current; </p><p>
59、; int frame_using[VIDEO_MAX_FRAME]; // 這兩個變量用于雙緩沖 </p><p> }; typedef struct _v4l_struct v4l_device; </p><p> extern int v4l_open(char *, v4l_device *); </p><p> extern int v4l
60、_close(v4l_device *); </p><p> extern int v4l_get_capability(v4l_device *); </p><p> extern int v4l_get_picture(v4l_device *); </p><p> extern int v4l_get_mbuf(v4l_device *); <
61、;/p><p> extern int v4l_set_picture(v4l_device *, int, int, int, int, int); </p><p> extern int v4l_grab_picture(v4l_device *, unsigned int); </p><p> extern int v4l_mmap_init(v4l_d
62、evice *); </p><p> extern int v4l_grab_init(v4l_device *, int, int,int); </p><p> extern int v4l_grab_frame(v4l_device *, int); </p><p> extern int v4l_grab_sync(v4l_device *); &
63、lt;/p><p> int v4l_open(char *dev , v4l_device *vd) </p><p><b> { </b></p><p> dev= DEFAULT_DEVICE; </p><p> if((vd->fd=open(dev,O_RDWR))<0){perror(&
64、quot;v4l_open");return -1;} </p><p> if(v4l_get_capability(vd))return -1; </p><p> if(v4l_get_picture(vd))return -1; // 這兩個函數(shù)就是即將要完成的獲取設(shè)備信息的函數(shù) </p><p> return 0; </p>
65、<p><b> }</b></p><p> int v4l_get_capability(v4l_device *vd) </p><p><b> {</b></p><p> if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability))
66、< 0) {</p><p> perror("v4l_get_capability:");</p><p> return -1;</p><p><b> }</b></p><p><b> return 0;</b></p><p>
67、<b> }</b></p><p> int v4l_get_picture(v4l_device *vd)</p><p><b> {</b></p><p> if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0) {</p&g
68、t;<p> perror("v4l_get_picture:");</p><p> return -1;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b&g
69、t;</p><p> int v4l_get_mbuf(v4l_device *vd)</p><p><b> {</b></p><p> if (ioctl(vd->fd, VIDIOCGMBUF ,&(vd->mbuf)) < 0) {</p><p> perror(&quo
70、t;v4l_get_mbuf:");</p><p> return -1;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int
71、v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white) </p><p><b> {</b></p><p> /* if(br)*/ vd->picture.brightness=25000; </p><p> /* if(hue)*/
72、 vd->picture.hue=25000; </p><p> /* if(col)*/ vd->picture.colour=65535; </p><p> /* if(cont)*/ vd->picture.contrast=30000; </p><p> /* if(white)*/ vd->picture.whitene
73、ss=25000; </p><p> if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0) </p><p> {perror("v4l_set_picture: ");return -1;} </p><p> return 0; </p><p&g
74、t;<b> } </b></p><p> int v4l_grab_picture(v4l_device *vd, unsigned int size) </p><p><b> { </b></p><p> if(read(vd->fd,&(vd->map),size)==0)retu
75、rn -1; </p><p> return 0; </p><p><b> } </b></p><p> int v4l_mmap_init(v4l_device *vd) </p><p><b> {</b></p><p> if (v4l_get
76、_mbuf(vd) < 0) </p><p> return -1;</p><p> if ((vd->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, vd->fd, 0)) < 0) { </p><p> perror("v4l
77、_mmap_init:mmap");</p><p> return -1;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int
78、v4l_grab_init(v4l_device *vd, int width, int height,int pal) </p><p><b> {</b></p><p> vd->mmap.width = width;</p><p> vd->mmap.height = height;</p>&l
79、t;p> pal= vd->picture.palette;</p><p> vd->mmap.format=pal;</p><p> vd->frame_current = 0; </p><p> vd->frame_using[0] = FALSE;</p><p> vd->frame
80、_using[1] = FALSE;</p><p> return v4l_grab_frame(vd, 0); </p><p><b> }</b></p><p> //真正獲得圖像的函數(shù) extern int v4l_grab_frame(v4l_device *, int); </p><p>
81、int v4l_grab_frame(v4l_device *vd, int frame) </p><p><b> {</b></p><p> if (vd->frame_using[frame]) {</p><p> fprintf(stderr, "v4l_grab_frame: frame %d is a
82、lready used.\n", frame);</p><p> return -1;</p><p><b> }</b></p><p> vd->mmap.frame = frame;</p><p> if (ioctl(vd->fd, VIDIOCMCAPTURE, &(
83、vd->mmap)) < 0) {</p><p> perror("v4l_grab_frame");</p><p> return -1;</p><p><b> }</b></p><p> vd->frame_using[frame] = TRUE;</p&
84、gt;<p> vd->frame_current = frame;</p><p><b> return 0;</b></p><p><b> }</b></p><p> //在截取圖像后還要進(jìn)行同步操作,就是調(diào)用 extern int v4l_grab_sync(v4l_device
85、*); 該函數(shù)如下 </p><p> int v4l_grab_sync(v4l_device *vd)</p><p><b> {</b></p><p> if (ioctl(vd->fd, VIDIOCSYNC, &(vd->frame_current)) < 0) {</p><p
86、> perror("v4l_grab_sync");</p><p><b> }</b></p><p> vd->frame_using[vd->frame_current] = FALSE;</p><p><b> return 0;</b></p>&l
87、t;p><b> }</b></p><p> int v4l_close(v4l_device *vd) </p><p><b> {</b></p><p> close(vd->fd);</p><p><b> return 0;</b><
88、/p><p><b> }</b></p><p> //該函數(shù)返回 0 說明你想要獲取的圖像幀已經(jīng)獲取完畢。 </p><p> //圖像的位置,存在 vd.map+vd.mbuf.offsets[vd.frame_current] 處。其中 vd.frame_current=0 ,為</p><p> //第一幀
89、的位置, vd.frame_current=1 ,為第二幀的位置。</p><p> void bufBRExchange(unsigned char * buf, int bufLength)</p><p><b> {</b></p><p><b> int i=0;</b></p><p
90、> printf("ECHG SUC\n");//bufLength-=2;</p><p> unsigned char temp;</p><p> for(i=15;i<921615;i+=3)</p><p><b> {</b></p><p> temp=buf[i]
91、;</p><p> buf[i]=buf[i+2];</p><p> buf[i+2]=temp;</p><p><b> }</b></p><p><b> }</b></p><p> int main() </p><p>
92、{v4l_device vd;</p><p> unsigned char* buf;// unsigned char nbuf[1843216];</p><p> v4l_open(DEFAULT_DEVICE,&vd); </p><p> v4l_mmap_init(&vd); </p><p> v4l
93、_grab_init(&vd,640,480,0); </p><p> v4l_grab_sync(&vd); // 此時就已經(jīng)獲得了一幀的圖像,存在 vd.map 中 </p><p> //buf=(unsigned char*) vd.map+vd.mbuf.offsets[vd.frame_current];</p><p> whi
94、le(TRUE) </p><p><b> { </b></p><p> buf=vd.map+vd.mbuf.offsets[vd.frame_current];</p><p> printf("%d\n",vd.mbuf.size);</p><p> bufBRExchange(b
95、uf,vd.mbuf.size);</p><p> //unsigned char echg;</p><p> vd.frame_current ^= 1; </p><p> v4l_grab_frame(&vd, vd.frame_current); </p><p> v4l_grab_sync(&vd)
96、; </p><p> printf("FRAME 1 OK!\n");</p><p> if(-1 == (write_jpeg("/var/www/pic002.jpg",buf,30,640,480,0)))</p><p><b> {</b></p><p>
97、printf("write_jpeg error\n");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> printf("FRAME 2 OK!\n"); </p><p>
98、 //圖像處理函數(shù)(vd.map+vd.mbuf.offsets[vd.frame_current] );//循環(huán)采集</p><p> // 其中 vd.map+vd.mbuf.offsets[vd.frame_current] 就是圖像所在位置。</p><p><b> }</b></p><p> v4l_close(&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式課程設(shè)計報告 (2)
- 嵌入式課程設(shè)計報告---嵌入式文件鎖應(yīng)用
- 嵌入式課程設(shè)計報告91452
- 《嵌入式系統(tǒng)設(shè)計》課程設(shè)計報告
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計報告--數(shù)字相框
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計
- 嵌入式課程設(shè)計報告--qtopia移植
- 嵌入式課程設(shè)計報告畢業(yè)論文
- 嵌入式課程設(shè)計報告畢業(yè)論文
- 嵌入式硬件課程設(shè)計報告---電梯系統(tǒng)
- 嵌入式課程設(shè)計---嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)
- 嵌入式課程設(shè)計--串口通信
- 嵌入式課程設(shè)計大作業(yè)
- 嵌入式系統(tǒng)綜述課程設(shè)計
- 嵌入式wince課程設(shè)計報告(黑白棋)
評論
0/150
提交評論