USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件_第1頁
USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件_第2頁
USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件_第3頁
USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件_第4頁
USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

USB攝像頭實(shí)驗(yàn)的學(xué)習(xí)課件第1頁/共21頁

硬件:

PC機(jī) 1臺(tái)

MagicARM2410教學(xué)實(shí)驗(yàn)開發(fā)平臺(tái) 1臺(tái)

USB攝像頭(OV511芯片組) 1個(gè)

軟件:

RedHatLinux9.0操作系統(tǒng)

Windows98/2000/XP操作系統(tǒng)(可選) 嵌入式Linux開發(fā)環(huán)境2.實(shí)驗(yàn)設(shè)備第2頁/共21頁

通過使用video4linux的API函數(shù)從視頻設(shè)備(OV511攝像頭)中讀取圖像數(shù)據(jù),然后將這些數(shù)據(jù)寫入FrameBuffer,使攝像頭采集到的圖像在液晶屏中顯示出來。3.實(shí)驗(yàn)內(nèi)容第3頁/共21頁(1)熟悉嵌入式Linux應(yīng)用程序的編寫及其編譯調(diào)試的方法。(2)熟悉nfs文件系統(tǒng)的使用。(3)復(fù)習(xí)FrameBuffer模塊應(yīng)用實(shí)驗(yàn)和video4linux模塊應(yīng)用實(shí)驗(yàn)。4.實(shí)驗(yàn)預(yù)習(xí)要求第4頁/共21頁采集程序?qū)崿F(xiàn)過程:首先打開視頻設(shè)備,視頻采集設(shè)備在系統(tǒng)中對(duì)應(yīng)的設(shè)備文件為/dev/video0,采用系統(tǒng)調(diào)用函數(shù)fd=open("/dev/video0",O_RDWR),fd是設(shè)備打開后返回的文件描述符(打開錯(cuò)誤返回-1),以后的系統(tǒng)調(diào)用函數(shù)就可使用它來對(duì)設(shè)備文件進(jìn)行操作了。接著,利用ioct1(fd,VIDIOCGCAP,&grab_cap)函數(shù)讀取struct

video_capability中有關(guān)圖像捕捉設(shè)備的信息。該函數(shù)成功返回后,這些信息從內(nèi)核空間拷貝到用戶程序空間grab_cap各成員分量中,使用printf函數(shù)就可得到各成員分量信息,例如printf("maxheight=%d",grab_fd.maxheight)獲得最大垂直分辨率的大小。

5.實(shí)驗(yàn)原理第5頁/共21頁還可以使用ioct1(fd,VIDIOCGPICT,&grab_pic)函數(shù)讀取視頻采集設(shè)備緩沖voideo_picture信息。在用戶空間程序中可以改變這些信息,具體方法為先給變量賦新值,再調(diào)用VIDIOCSPICT

ioct1函數(shù),如程序清單1.1所示:程序清單1.1改變圖像捕捉設(shè)備緩沖信息grab_fd.depth=3;if(ioct1(fd,VIDIOCSPICT,&grab_pic)<0){ perror("VIDIOCSPICT");return

-1;}5.實(shí)驗(yàn)原理第6頁/共21頁

完成以上初始化設(shè)備工作后,就可以對(duì)視頻圖像截取了,有兩種方法:一種是read()直接讀??;另外一種mmap()內(nèi)存映射。Read()通過內(nèi)核緩沖區(qū)來讀取數(shù)據(jù);而mmap()通過把設(shè)備文件映射到內(nèi)存中,繞過了內(nèi)核緩沖區(qū),最快的磁盤訪問往往還是慢于最慢的內(nèi)存訪問,所以mmap()方式加速了I/O訪問。另外,mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一文件實(shí)現(xiàn)共享內(nèi)存,各進(jìn)程可以像訪問普通內(nèi)存一樣對(duì)文件進(jìn)行訪問,訪問時(shí)只需要使用指針而不用調(diào)用文件操作函數(shù)。因?yàn)閙map()的以上優(yōu)點(diǎn),所以在程序?qū)崿F(xiàn)中采用了內(nèi)存映射方式,即mmap()方式。5.實(shí)驗(yàn)原理第7頁/共21頁利用mmap()方式視頻裁取具體進(jìn)行操作如下:①先使用ioct1(fd,VIDIOCGMBUF,&grab_vm)函數(shù)獲得攝像頭存儲(chǔ)緩沖區(qū)的幀信息,之后修改voideo_mmap中的設(shè)置,例如重新設(shè)置圖像幀的垂直及水平分辨率、彩色顯示格式。可利用如下語句:grab_buf.height=240;grab_buf.width=320;grab_buf.format=VIDEO_PALETTE_RGB24;

②接著把攝像頭對(duì)應(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ù)成功時(shí)返回映像內(nèi)存區(qū)的指針,出錯(cuò)時(shí)返回值為-1。

5.實(shí)驗(yàn)原理第8頁/共21頁下面對(duì)單幀采集和連續(xù)幀采集進(jìn)行說明:?jiǎn)螏杉谏厦娅@取的攝像頭存儲(chǔ)緩沖區(qū)幀信息中,最多可支持的幀數(shù)(frames的值)一般為兩幀。對(duì)于單幀采集只需設(shè)置grab_buf.frame=0,即采集其中的第一幀,使用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)函數(shù),若調(diào)用成功,則激活設(shè)備真正開始一幀圖像的截取,是非阻塞的。接著使用ioct1(fd,VIDIOCSYNC,&frame)函數(shù)判斷該幀圖像是否截取完畢,成功返回表示截取完畢,之后就可把圖像數(shù)據(jù)寫入到FrameBuffer。5.實(shí)驗(yàn)原理第9頁/共21頁連續(xù)幀采集在單幀的基礎(chǔ)上,利用grab_fd.frames值確定采集完畢攝像頭幀緩沖區(qū)幀數(shù)據(jù)進(jìn)行循環(huán)的次數(shù)。在循環(huán)語句中,也是使用VIDIOCMCCAPTURE

ioct1和VIDIOCSYNC

ioctl函數(shù)完成每幀截取,但要給采集到的每幀圖像賦地址,利用語句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要繼續(xù)采集可再加一個(gè)外循環(huán),在外循環(huán)語句只要給原來的內(nèi)循環(huán)再賦frame=0即可。本實(shí)驗(yàn)中使用單幀采集的方式。

5.實(shí)驗(yàn)原理第10頁/共21頁(1)在PC端,打開終端或進(jìn)入虛擬控制臺(tái),進(jìn)入ARM實(shí)驗(yàn)?zāi)夸?zylinux/armwork/,為本實(shí)驗(yàn)新建工作目錄video4linux。$cd/zylinux/armwork$mkdirvideo4linux(2)使用自己熟悉的編輯器(例如vi)建立文件videodemo.c,編寫實(shí)驗(yàn)代碼并保存。$vivideodemo.c(3)編譯程序,生成可執(zhí)行代碼videodemo.o。$arm-linux-gcc-s-Wall-I/zylinux/kernel/include-Wstrict-prototypesvideodemo.c-ovideodemo(4)短接JP7,起動(dòng)MagicARM2410實(shí)驗(yàn)箱的Linux,進(jìn)行NFS連接。

6.實(shí)驗(yàn)步驟第11頁/共21頁(5)分別加載USB內(nèi)核模塊和video4linx視頻模塊:usbcore.o、usb-ohci-s3c2410.ko和videodev.o。#insmodusbcore.o#insmodusb-ohci-s3c2410.ko#insmodvideodev.o(6)進(jìn)入U(xiǎn)SB攝像頭VO511驅(qū)動(dòng)所在的文件夾,加載VO511的驅(qū)動(dòng)程序:ov511.o。#insmodov511.o

6.實(shí)驗(yàn)步驟第12頁/共21頁(7)插入U(xiǎn)SB攝像頭到USB主機(jī)下行口,這時(shí)在終端上將打印以下信息:ov511.c:USBOV511+camerafoundov511.c:Cameratype(108)notrecognizedov511.c:Pleasenotifymmcclell@ofthename,ov511.c:manufacturer,model,andthisnumberofyourcamera.ov511.c:Alsoincludetheoutputofthedetectionprocess.ov511.c:SensorisanOV7620ov511.c:Deviceregisteredonminor0

(8)進(jìn)入到本實(shí)驗(yàn)程序所在文件夾,運(yùn)行本實(shí)驗(yàn)程序,觀察液晶屏的圖像效果:#./videodemo6.實(shí)驗(yàn)步驟第13頁/共21頁實(shí)驗(yàn)程序的主函數(shù)如程序清單1.2所示。程序清單1.2實(shí)驗(yàn)程序的主函數(shù)intmain(void){fb_v41vd;intret,i;unsignedshort*imageptr;unsignedshorttempbuf[640*480];ret=open_framebuffer(FB_FILE,&vd); //打開FrameBuffer設(shè)備

if(0!=ret) {gotoerr;} for(i=0;i<640*480;i++)tempbuf[i]=0xffff;rgb_to_framebuffer(&vd,640,480,0,0,tempbuf); //填充FrameBuffer顏色

ret=open_video(V4L_FILE,&vd,16,VIDEO_PALETTE_RGB565, 320,240);if(0!=ret) //打開視頻設(shè)備失敗

{gotoerr;}7.實(shí)驗(yàn)參考程序第14頁/共21頁//打印設(shè)備信息

printf();printf(",Type:%d\n",vd.capability.type);

printf("Maxwidth:%d,Maxheight:%d\n",vd.capability.maxwidth,vd.capability.maxheight);printf("Minwidth:%d,Minheight:%d\n",vd.capability.minwidth,vd.capability.minheight);printf("Channels:%d,Audios:%d\n",vd.capability.channels,vd.capability.audios);while(1){ imageptr=(unsignedshort*)get_frame_address(&vd); rgb_to_framebuffer(&vd,vd.mmap.width,vd.mmap.height,

160,120,imageptr); if(get_next_frame(&vd)!=0) //獲取圖像數(shù)據(jù)出錯(cuò)

{gotoerr;}}err: if(vd.fbfd)close(vd.fbfd); //關(guān)閉FrameBuffer設(shè)備

if(vd.fd) close(vd.fd); exit(0); return0;}7.實(shí)驗(yàn)參考程序第15頁/共21頁

打開FrameBuffer設(shè)備函數(shù)如程序清單1.3所示。程序清單1.3打開FrameBuffer設(shè)備函數(shù)intopen_framebuffer(char*ptr,fb_v41*vd){intfbfd,screensize;fbfd=open(ptr,O_RDWR); //Openthefileforreadingandwritingif(fbfd<0){printf("Error:cannotopenframebufferdevice.%x\n",fbfd);returnERR_FRAME_BUFFER;}printf("Theframebufferdevicewasopenedsuccessfully.\n");vd->fbfd=fbfd; //保存打開FrameBuffer設(shè)備的句柄

//Getfixedscreeninformation獲取FrameBuffer固定不變的信息

if(ioctl(fbfd,FBIOGET_FSCREENINFO,&vd->finfo)){printf("Errorreadingfixedinformation.\n");returnERR_FRAME_BUFFER;}7.實(shí)驗(yàn)參考程序第16頁/共21頁

打開FrameBuffer設(shè)備函數(shù)如程序清單1.3所示。程序清單1.3打開FrameBuffer設(shè)備函數(shù)intopen_framebuffer(char*ptr,fb_v41*vd){intfbfd,screensize;fbfd=open(ptr,O_RDWR); //Openthefileforreadingandwritingif(fbfd<0){printf("Error:cannotopenframebufferdevice.%x\n",fbfd);returnERR_FRAME_BUFFER;}printf("Theframebufferdevicewasopenedsuccessfully.\n");vd->fbfd=fbfd; //保存打開FrameBuffer設(shè)備的句柄

//Getfixedscreeninformation獲取FrameBuffer固定不變的信息

if(ioctl(fbfd,FBIOGET_FSCREENINFO,&vd->finfo)){printf("Errorreadingfixedinformation.\n");returnERR_FRAME_BUFFER;}7.實(shí)驗(yàn)參考程序第17頁/共21頁//Getvariablescreeninformation獲取FrameBuffer屏幕可變的信息

if(ioctl(fbfd,FBIOGET_VSCREENINFO,&vd->vinfo)){printf("Errorreadingvariableinformation.\n");returnERR_FRAME_BUFFER;}printf("%dx%d,%dbpp,xoffset=%d,yoffset=%d\n",vd->vinfo.xres, vd->vinfo.yres,vd->vinfo.bits_per_pixel,vd->vinfo.xoffset,vd->vinfo.yoffset);//Figureoutthesizeofthescreeninbytesscreensize=vd->vinfo.xres*vd->vinfo.yres*vd->vinfo.bits_per_pixel/8;//Mapthedevicetomemory影射Framebuffer設(shè)備到內(nèi)存

vd->fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);if((int)vd->fbp==-1){printf("Error:failedtomapframebufferdevicetomemory.\n");returnERR_FRAME_BUFFER;}printf("Theframebufferdevicewasmappedtomemorysuccessfully.\n");return0;}7.實(shí)驗(yàn)參考程序第18頁/共21頁打開視頻設(shè)備函數(shù)如程序清單1.4所示。程序清單1.4打開視頻設(shè)備intopen_video(char*fileptr,fb_v41*vd,intdep,intpal,intwidth,intheight){if((vd->fd=open(fileptr,O_RDWR))<0)//打開視頻設(shè)備

{ perror("v4l_open:"); returnERR_VIDEO_OPEN;}if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability))<0){ perror("v4l_get_capability:"); returnERR_VIDEO_GCAP;}if(ioctl(vd->fd,VIDIOCGPICT,&(vd->picture))<0){ perror("v4l_get_picture"); returnERR_VIDEO_GPIC;}//設(shè)置圖象

vd->picture.palette=pal; //調(diào)色板

vd->picture.depth=dep; //像素深度7.實(shí)驗(yàn)參考程序第19頁/共21頁

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論