

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 嵌入式課程設計報告</b></p><p><b> 一、課程設計目的</b></p><p> 1.1 掌握linux開發(fā)環(huán)境的搭建; </p><p> 1.2鞏固嵌入式交叉編譯的開發(fā)思想;</p><p> 1.3掌握嵌入式GUI軟件設計技。,.
2、;</p><p><b> 課程設計要求</b></p><p> 輸入信號為 1 路 AV 視頻信號,要求系統(tǒng)能對 1 路輸入信號進行實時采集,數字化 處理,壓縮,存儲,要保證一定的錄像質量. 根據設計題目的要求,選擇確定 ARM 芯片型號,視頻采集芯片型號,完成系統(tǒng)硬件設 計和程序設計.</p><p><b> 課程設計
3、內容</b></p><p> 設計原理 ARM10 系列微處理器為低功耗的 32 位 RISC 處理器,最適合用于對價位和功耗要 求較高的消費類應用.</p><p> ARM10 系列微處理器的主要應用領域為:工業(yè)控制,Internet 設備,調制解 調器設備,移動電話等多種多媒體和嵌入式應用. </p><p> 視頻監(jiān)控系統(tǒng)總體設計
4、首先需要對系統(tǒng)進行總體規(guī)劃,將系統(tǒng)劃分成幾個功能模塊,確定各個模塊的實現 方法.整個視頻監(jiān)控系統(tǒng)采用 C/S 結構,從主體上分為兩部分:服務器端和客戶端.服 務器端主要包括 S3C4510 平臺上運行的采集,壓縮,傳輸程序,客戶端是 PC 機上運行 的接收,解壓,回放程序.視頻監(jiān)控終端從攝像頭捕獲實時的視頻信息,壓縮之后通過 以太網傳輸到視頻監(jiān)控服務器上.</p><p> 視頻圖像采集和打包發(fā)送在服務器端完成
5、,圖像的接收 解包和回放將在客戶端完成. 采集圖像 數據壓縮 打包發(fā)送 接收</p><p> 系統(tǒng)的硬件設計 系統(tǒng)采用模塊化設計方案,主要包括以下幾個模塊:主控制器模塊,儲存電路模塊, 外圍接口電路模塊,電源和復位電路,</p><p> S3C4510 主控器模塊 </p><p> 主控器模塊是整個系統(tǒng)的核心,采用的 S3C4510B 處理器.Sam
6、sung 公司的 S3C45 10B 是基于以太網應用系統(tǒng)的高性價比 16/32 位 RISC 微控制器,內含一個由 ARM 公司設計的 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)內核,文件系統(tǒng),應用程序以及環(huán)境變量和系統(tǒng)配置文件等;S DRAM 讀寫速度快,系統(tǒng)運行時把它作為內存單元使用. </p><p><b> 外圍電路模塊 </b></p><p> 外圍電路主要是以下幾個電路,復位電路圖,電源電路圖以及 JTAG 電路,</p&
8、gt;<p> 三、課程設計設備及工具</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> 四、設計方案</b></p>
9、<p> 本次課程設計采用arm10開發(fā)平臺。該平臺采用Samsung公司的處理器S3C2410。該處理器內部集成了ARM公司 ARM920T處理器核的32位微控制器,資源豐富,帶獨立的16KB的指令Cache和16KB數據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,主頻最高可達203MHz。在處理器豐富資源的基礎上,還進行了相關的配置和擴展,平臺配置了16MB 16位的Flash和64MB 32位的SDRAM。通過以太網控制器芯片DM9000E擴展了一個網口,另外引出了一個HOST USB接口。通過在USB接口上外接一個帶USB口的攝像頭,將采集到的視頻圖像數據放入輸入緩沖區(qū)中。然后,對緩沖區(qū)中的視頻數據進行壓縮成幀,并把每一幀圖片在網頁中顯示出來,每秒鐘刷新兩次,得
11、到一個動態(tài)的視頻界面,然后通過局域網訪問該主機的網頁,得到網絡視頻信息。本次課程設計主要是完成得到視頻圖片及網頁刷新的過程。</p><p> 本次設計要求在局域網環(huán)境中進行。</p><p><b> 五、開發(fā)環(huán)境配置</b></p><p> 5.1 攝像頭驅動加載</p><p> 在Linux下,設備驅動
12、程序可以看成Linux內核與外部設備之間的接口。設備驅動程序向應用程序屏蔽了硬件實現了的細節(jié),使得應用程序可以像操作普通文件一樣來操作外部設備,可以使用和操作文件中相同的、標準的系統(tǒng)調用接口函數來完成對硬件設備的打開、關閉、讀寫和I/O控制操作,而驅動程序的主要任務也就是要實現這些系統(tǒng)調用函數。本系統(tǒng)平臺使用的嵌入式arm-Linux系統(tǒng)在內核主要功能上與 Linux操作系統(tǒng)沒本質區(qū)別。</p><p> Vi
13、deo4Linux(簡V4L)是Linux中關于視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供一系列接口函數,這些視頻設備包括現今市場上流行的TV卡、視頻捕捉卡和USB攝像頭等。</p><p> ov511的驅動,2.4的內核中就有,所以我們只需重新編譯內核,將下邊的選項都選上,然后重新燒寫內核就可以了。也就是直接靜態(tài)加載。(1)在arm linux的kernel目錄下make menuconfig
14、。(2)首先(*)選擇Multimedia device->下的Video for linux。加載video4linux模塊,為視頻采集設備提供編程接口;(3)然后在usb support->目錄下(*)選擇support for usb和usb camera ov511 support。這使得在內核中加入了對采用OV511接口芯片的USB數字攝像頭的驅動支持。(4)保存配置退出。(5)make dep;make
15、zImage就生成了帶有ov511 驅動的內核。接下來就通過uboot將內核燒到flash里去。這時你將攝像頭插上,系統(tǒng)就會提示發(fā)現攝像頭-ov511+,這說明驅動正常。:-),驅動加載就成功了。</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> 設計過程</b></p><p><b> 6.1 硬件設計</b></p><p> 系統(tǒng)的主體設計思想是將視頻前端和嵌入式Web服務器整合在一起,攝像頭通過USB接口和嵌入式系統(tǒng)板的USB HOST相連,攝像頭采集來的視頻信號經過壓縮后,通過內部總線傳送到內置的Web服務器,客戶端采用瀏覽器/服務器結構(即B/S結構),可以通過
20、IE瀏覽器訪問視頻Web服務器,以便查看所監(jiān)控的視頻畫面,而且,用戶還可以控制平臺對鏡頭的動作或對系統(tǒng)進行配置控制。</p><p> 網絡視頻采集系統(tǒng)是由視頻監(jiān)控終端和視頻監(jiān)控中心組成,終端使用嵌入式系統(tǒng)加上USB攝像頭,在Linux操作系統(tǒng)上運行USB攝像頭的驅動和相應的視頻采集處理傳輸程序,得到視頻監(jiān)控畫面,并畫面通過網絡傳輸,監(jiān)控中心運行監(jiān)控軟件端,通過Internet瀏覽器來瀏覽終端送來的監(jiān)控畫面,其
21、硬件連接圖如下所示:</p><p> 網絡視頻采集硬件連接圖</p><p> 從圖中可以看出,PC機部分可以直接采用IE瀏覽器,不需要在PC機上運行其他的軟件,主要設計工作是開發(fā)板端的設計。視頻監(jiān)控終端主要有兩個部分組成,硬件部分包括攝像頭和開發(fā)平臺的選擇;軟件部分包括系統(tǒng)級軟件(Boot Loader,嵌入式操作系統(tǒng),USB驅動程序)與用戶級軟件(應用程序)。</p>
22、<p><b> 6.2 軟件設計</b></p><p> Video4linux為應用程序提供了一系列的接口函數,通過這些函數,可以執(zhí)行打開、讀寫、關閉等基本操作。設備驅動提供了read、write、open、close等函數的具體實現,在內核這些函數都可以調用。視頻采集流程圖如下所示:</p><p><b> 視頻采集流程圖<
23、;/b></p><p> 利用V4L編寫的視頻采集程序重要代碼如下,下列代碼包含采集編碼程序一些關鍵函數。</p><p> 程序中定義的數據結構</p><p> struct _v4l_struct </p><p><b> { </b></p><p> int fd;
24、 // 保存打開視頻文件的設備描述符 </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; // 用于指向圖像數據的指針 </p><p> int frame_current; </p><p> int frame_using[VIDEO_MAX_FRAME]; // 這兩個變量用于雙緩沖 </p><p> }
26、; typedef struct _v4l_struct v4l_device; </p><p> 這些數據結構都是由Video4Linux支持的,它們的用途如下:</p><p> *video_capability包含攝像頭的基本信息,例如設備名稱、支持的最大最小分辨率、信號源信息等;</p><p> *voide_picture包含設備采集圖像的各種
27、屬性,如brightness(亮度)、hue(色調)、contrast(對比度)、whiteness(色度)、color(深度)等;</p><p> *video_mmap用于內存映射;</p><p> *voido_mbuf利用mmap進行映射的幀信息,實際上是輸入到攝像頭存儲器緩沖中的幀信息,包括size(幀的大?。?、frames(最多支持的幀數)、offsets(每幀相對基址
28、的偏移)。</p><p> 程序中用到的主要系統(tǒng)調用函數有: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)中把設備看成設備文件,在用戶空間可以通過標準的I/O系統(tǒng)調用函數操作設備文件,從而達到與設備通信交互的目的。當然,在設備驅動中要提供對這些函數的相應支持。這里說明一下ioctl(int fd,int cmd,…)函數,它在用戶程序中用來控制I/O通道,其中,fd代表設備文件描述符,cmd代表用戶程序對設備的控制命令,省略號一般是一個表示類型長度的參數,也可沒有。&
30、lt;/p><p> ?。?)采集程序實現過程</p><p> 首先打開視頻設備,攝像頭在系統(tǒng)中對應的設備文件為/dev/video0,采用系統(tǒng)調用函數grab_fd =open ("/dev/video0",O_RDWR),grab_fd是設備打開后返回的文件描述符(打開錯誤返回-1),以后的系統(tǒng)調用函數就可使用它來對設備文件進行操作了。接著,利用ioct1(grab
31、_fd,VIDIOCGCAP,&grab_cap)函數讀取struct video_capability中有關攝像頭的信息。該函數成功返回后,這些信息從內核空間拷貝到用戶程序空間grab_cap各成員分量中,使用 printf函數就可得到各成員分量信息,例如printf("maxheight=%d",grab_fd.maxheight)獲得最大垂直分辨率的大小。不規(guī)則用ioct1(grab_fd,VIDIOC
32、GPICT,&grab_pic)函數讀取攝像頭緩沖中voideo_picture信息。在用戶空間程序中可以改變這些信息,具體方法為先給分量賦新值,再調用VIDIOCSPICT ioct1函數,例如:</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> 完成以上初始化設備工作后,就可以對視頻圖像截取了,有兩種方法:一種是read()直接讀取;另外一種 mmap()內存映射。Read ()通過內核緩沖區(qū)來讀取數據;而mmap()通過把設備文件映射到內存中,繞過了內核緩沖區(qū),最快的磁盤訪問往往還是慢于最慢的內存訪問,所以m
34、map ()方式加速了I/O訪問。另外,mmap()系統(tǒng)調用使得進程之間通過映射同一文件實現共享內存,各進程可以像訪問普通內存一樣對文件進行訪問,訪問時只需要使用指針而不用調用文件操作函數。因為mmap()的以上優(yōu)點,所以在程序實現中采用了內存映射方式,即mmap()方式。</p><p> 利用mmap()方式視頻裁取具體進行操作如下。</p><p> ?、傧仁褂胕oct1(grab
35、_fd,VIDIOCGMBUF,&grab_vm)函數獲得攝像頭存儲緩沖區(qū)的幀信息,之后修改voideo_mmap中的設置,例如重新設置圖像幀的垂直及水平分辨率、彩色顯示格式??衫萌缦抡Z句</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像頭對應的設備文件映射到內存區(qū),具體使用grab_data=(unsigned char*) mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。這樣設備文件的內容就映射到內存區(qū),該映射內容區(qū)可讀可寫并且不同進程間可共享。該函數成功時返回映像內存區(qū)的指
37、針,挫敗時返回值為-1。</p><p> 下面對單幀采集和連續(xù)幀采集進行說明:</p><p> *單幀采集。在上面獲取的攝像頭存儲緩沖區(qū)幀信息中,最多可支持的幀數(frames的值)一般為兩幀。對于單幀采集只需設置 grab_buf.frame=0,即采集其中的第一幀,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf) 函數,若調用成功,則激
38、活設備真正開始一幀圖像的截取,是非阻塞的。接著使用ioct1(grab_fd,VIDIOCSYNC,&frame) 函數判定該幀圖像是否截取完畢,成功返回表示截取完畢,之后就可把圖像數據保存成文件的形式。</p><p><b> 測試與實現</b></p><p> ?。?)仔細檢查設備的連接,打開電源;</p><p> ?。?)
39、在PC機上的瀏覽器中地址欄輸入開發(fā)板地址,網頁自動跳到開發(fā)板的首頁;</p><p> ?。?)在頁面上可見攝像頭采集到的視頻信息。</p><p> 經驗證,本次設計基本達到設計要求。</p><p><b> 設計心得</b></p><p> 本次課程設計通過運用嵌入式技術,圖形處理技術等,完成了網絡視頻的采
40、集過程,進一步熟悉了交叉編譯的開發(fā)方法,在開發(fā)的過程中,遇到很多問題,如驅動無法加載,程序調試出錯等,通過重新編譯開發(fā)板內核、安裝圖形處理庫等,解決了多個問題,在解決問題的過程中,我們對嵌入式的開發(fā)過程多了一些細節(jié)的認識,為以后的持續(xù)學習鞏固了基礎。</p><p> 在設計過程中,我們分工合作,一起進步,不只從理論上對嵌入式有了更深的認識,同時從實踐中驗證了學習的理論知識,對嵌入式有了更深一步的認識。<
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> //這個函數很通用,它的作用是把buf中的數據壓縮成jpeg格式。</p><p> struct _v4l_struct
57、 </p><p><b> { </b></p><p> int fd; // 保存打開視頻文件的設備描述符 </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; // 用于指向圖像數據的指針 </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; // 這兩個函數就是即將要完成的獲取設備信息的函數 </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> //真正獲得圖像的函數 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> //在截取圖像后還要進行同步操作,就是調用 extern int v4l_grab_sync(v4l_device
85、*); 該函數如下 </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> //該函數返回 0 說明你想要獲取的圖像幀已經獲取完畢。 </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); // 此時就已經獲得了一幀的圖像,存在 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、 //圖像處理函數(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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式課程設計報告 (2)
- 嵌入式課程設計報告---嵌入式文件鎖應用
- 嵌入式課程設計報告91452
- 《嵌入式系統(tǒng)設計》課程設計報告
- 嵌入式課程設計
- 嵌入式課程設計
- 嵌入式課程設計報告--數字相框
- 嵌入式課程設計
- 嵌入式課程設計
- 嵌入式課程設計
- 嵌入式課程設計
- 嵌入式課程設計報告--qtopia移植
- 嵌入式課程設計報告畢業(yè)論文
- 嵌入式課程設計報告畢業(yè)論文
- 嵌入式硬件課程設計報告---電梯系統(tǒng)
- 嵌入式課程設計---嵌入式網絡視頻監(jiān)控系統(tǒng)
- 嵌入式課程設計--串口通信
- 嵌入式課程設計大作業(yè)
- 嵌入式系統(tǒng)綜述課程設計
- 嵌入式wince課程設計報告(黑白棋)
評論
0/150
提交評論