扒开女人内裤猛进猛出免费视频 ,久久996re热这里只有精品无码 ,亚洲欧洲日产国码无码av喷潮,国产乱子乱人伦毛片

新聞中心News

聯(lián)系方式Contact Us

  • 深圳市聚泓瀚科技有限公司
  • 地址:深圳市寶安區(qū)松崗街道廣深路松崗段2號(hào)廠房宇恒工業(yè)園1棟4樓
  • 手機(jī):13923733903
  • 郵箱:kevin@juhonghan.com
  • 網(wǎng)址:yqmpw.cn
當(dāng)前位置:首頁(yè) > 新聞中心 > 行業(yè)新聞
行業(yè)新聞
轉(zhuǎn)]基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn)
發(fā)布時(shí)間:2019-03-14    閱覽次數(shù):1371 次  
  做了一段時(shí)間的攝像頭圖像采集,有了一些心得。在論壇上開(kāi)的2410攝像頭
問(wèn)題專貼(http://www.hhcn.com/cgi-bin/topic.cgi?forum=1&topic=247&show=0
也得到了大家的關(guān)注。在此,我將這一階段遇到的問(wèn)題,解決方法等做個(gè)總結(jié),
希望對(duì)您有所幫助。
Linux本身自帶了采用ov511芯片的攝像頭,而市場(chǎng)上應(yīng)用最廣泛的是采用中
芯微公司生產(chǎn)的zc301芯片的攝像頭,下面我將針對(duì)這兩大系列的攝像頭分別做
介紹。(注:所有的開(kāi)發(fā)都是在華恒HHARM-2410-EDU上完成,ov511攝像頭采
用的是網(wǎng)眼webeye3000,zc301攝像頭采用的是ANC奧尼S888)。
一 驅(qū)動(dòng)加載
1.1 ov511 驅(qū)動(dòng)
1.靜態(tài)加載
(1)在arm linux的kernel目錄下make menuconfig。
(2)首先(*)選擇Multimedia device->下的Video for linux。加載video4linux模塊,
為視頻采集設(shè)備提供了編程接口;
(3)然后在usb support->目錄下(*)選擇support for usb和usb camera ov511
support。這使得在內(nèi)核中加入了對(duì)采用OV511接口芯片的USB數(shù)字?jǐn)z像頭的驅(qū)動(dòng)
支持。
(4)保存配置退出。
(5)make dep;make zImage
此時(shí)在/tftpboot 下就生成了帶有ov511 驅(qū)動(dòng)的內(nèi)核。
2.動(dòng)態(tài)加載
(1)在arm linux的kernel目錄下make menuconfig。
(2)首先<*>選擇Multimedia device->下的Video for linux。
(3)然后在usb support->目錄下<*>選擇support for usb和<M>選擇usb camera
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 2 -
ov511 support。
(4)保存退出。
(5)Make dep;make zImage;make modules然后就在/driver/usb下生成ov511.o,同
時(shí)生成的zImage自動(dòng)放在/tftpboot下。
(6)然后用新內(nèi)核啟動(dòng)板子后insmod ov511.o就可以成功加載。
動(dòng)態(tài)方式與靜態(tài)方式相比,測(cè)試時(shí)要簡(jiǎn)單的多。不需要下載整個(gè)內(nèi)核,只需
通過(guò)nfs,加載驅(qū)動(dòng)即可測(cè)試。在測(cè)試成功后就可以編譯進(jìn)內(nèi)核。
模塊加載中出現(xiàn)的問(wèn)題:
1.insmod 和modprobe 間的一個(gè)區(qū)別試后者不會(huì)在當(dāng)前目錄中查找模塊,它只
在/lib/modules 下的缺省目錄下查找,這是因?yàn)樵摮绦蛑皇且粋€(gè)系統(tǒng)實(shí)用例程,
不是一個(gè)交互工具。可以通過(guò)在/etc/modules.conf 中指定自己的目錄,來(lái)把它們
加到缺省目錄集中。
2.如果插入模塊ov511.o 時(shí),出現(xiàn)以下信息:
Ov511.o:unresolved symbol video********之類的,說(shuō)明還有其它模塊videodev.o
沒(méi)有加。
3.出現(xiàn)錯(cuò)誤:ov511.o:couldn’t find the kernel version this modules was compiled
for。這是試圖插入一個(gè)不是可裝入模塊的目標(biāo)文件。因?yàn)樵趦?nèi)核配置階段,是
把ov511 模塊靜態(tài)加到內(nèi)核中的,雖然看起來(lái)和可裝入模塊的文件名ov511.o 完
全一樣,但是不能用insmod 命令加入。
4.如果出現(xiàn)Ov511.o:unresolved symbol video********,那就<M>選中video for
linux,用新生成的內(nèi)核啟動(dòng)系統(tǒng),再insmod videodev.o,insmod ov511.o 就可以啦。
1.2 zc301 驅(qū)動(dòng)
攝像頭的驅(qū)動(dòng)是從http://mxhaard.free.fr/下的針對(duì)embeded環(huán)境,有專門的patch,
我用的是usb-2.4.31LE06.patch。
(1)把它放到/HHARM9-EDU/kernel/driver/usb下,解壓,打補(bǔ)丁。就會(huì)在此目
錄下看到spca5xx文件夾了??赡軙?huì)有一些錯(cuò)誤,我的錯(cuò)誤是在Makefile和config.in
文件中,根據(jù)它的提示,進(jìn)行相應(yīng)的修改即可。Patch時(shí)會(huì)將修改方法寫到
Makefile.rej和config.in.rej文件中,把這兩個(gè)文件里的內(nèi)容加到Makefile和config.in
中就行了。
(2)編譯內(nèi)核,進(jìn)入/HHARM9-EDU/kernel,make menuconfig。我采用和上面
介紹的ov511驅(qū)動(dòng)的方法一樣,動(dòng)態(tài)加載。(M)選中SPCA5XX這一項(xiàng)。
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 3 -
( 3 ) make dep ; make zImage ; make modules 。就會(huì)在
/HHARM9-EDU/kernel/driver/usb/spca5xx 中生成
spca5xx.o,spcadecoder.o,spca_core.o啦。這就是我們要的驅(qū)動(dòng)。
(4)用新內(nèi)核啟動(dòng),insmod這三個(gè).o文件(可以不用加載spcadecoder.o),攝像
頭就加載成功啦。
不過(guò)這種LE的驅(qū)動(dòng)有許多問(wèn)題,比如運(yùn)行到設(shè)置圖像格式(RGB565或RGB24)時(shí)
出錯(cuò), 說(shuō)不支持此參數(shù)。原因在于: ( 摘自驅(qū)動(dòng)程序主頁(yè)
http://mxhaard.free.fr/spca5le.html)
The spca5xx-LE design is very different from the spca5xx full package(LE版的驅(qū)動(dòng)
和完全版的差很多)。
The memory in use are the most smaller as possible(LE版的驅(qū)動(dòng)會(huì)盡量減少內(nèi)存的
使用)
The spcadecoder is reduce and only raw jpeg webcam are used.(驅(qū)動(dòng)模塊只支持輸
出原始jpeg格式)。
還有一種方法, 從http://mxhaard.free.fr/download.html 下載最新的驅(qū)動(dòng)
spca5xx-20060402.tar.gz。這個(gè)可獨(dú)立編譯,無(wú)需放到linux內(nèi)核里面,編譯生成一個(gè)spca5xx.o
即可,不要三個(gè).o做驅(qū)動(dòng)了。因?yàn)檫@個(gè)驅(qū)動(dòng)是針對(duì)2.6的,編譯時(shí)會(huì)出現(xiàn)很多錯(cuò)誤,修改
CFLAGS即可。華恒的群里已經(jīng)有編譯好的驅(qū)動(dòng)提供大家下載。
模塊加載中出現(xiàn)的問(wèn)題:
1.運(yùn)行./servfox時(shí)出現(xiàn)Error Opening V4L interface.
我測(cè)試一下,是沒(méi)有加載驅(qū)動(dòng)。雖然內(nèi)核中(M)選中了驅(qū)動(dòng),但是啟動(dòng)后要手
工加進(jìn)去。insmod一下啦。
2.insmod spcadecoder.o時(shí),出現(xiàn)錯(cuò)誤:spcadecoder.o:couldn’t find the kernel version
this modules was compiled for。如果你insmod spca5xx.o成功的話就不需要再
insmod其他模塊了。
3.insmod video.o時(shí)卻說(shuō)can't find the kernel version the modules was compiled for。
這是因?yàn)関ideo for linux一般是直接編譯到內(nèi)核中去的.不需要加載的。
二 Video4linux 編程
2.1 Video4linux 簡(jiǎn)介
Video4Linux是為市場(chǎng)現(xiàn)在常見(jiàn)的電視捕獲卡和并口及USB口的攝像頭提供
統(tǒng)一的編程接口。同時(shí)也提供無(wú)線電通信和文字電視廣播解碼和垂直消隱的數(shù)據(jù)
接口。本文主要針對(duì)USB攝像頭設(shè)備文件/dev/video0,進(jìn)行視頻圖像采集方面的
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 4 -
程序設(shè)計(jì)。
2.2 Video4linux 編程指南
1.視頻編程的流程
(1)打開(kāi)視頻設(shè)備:
(2)讀取設(shè)備信息
(3)更改設(shè)備當(dāng)前設(shè)置(可以不做)
(4)進(jìn)行視頻采集,兩種方法:
a.內(nèi)存映射
b.直接從設(shè)備讀取
(5)對(duì)采集的視頻進(jìn)行處理
(6)關(guān)閉視頻設(shè)備。
定義的數(shù)據(jù)結(jié)構(gòu)及使用函數(shù)
struct _v4l_struct
{
int fd;
struct video_capability capability;
struct video_buffer buffer;
struct video_window window;
struct video_channel channel[8];
struct video_picture picture;
struct video_mmap mmap;
struct video_mbuf mbuf;
unsigned char *map;
};
typedef struct _v4l_struct v4l_device;
extern int v4l_open(char *, v4l_device *);
extern int v4l_close(v4l_device *);
extern int v4l_get_capability(v4l_device *);
extern int v4l_set_norm(v4l_device *, int);
extern int v4l_get_picture(v4l_device *);
extern int v4l_grab_init(v4l_device *, int, int);
extern int v4l_grab_frame(v4l_device *, int);
extern int v4l_grab_sync(v4l_device *);
extern int v4l_mmap_init(v4l_device *);
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 5 -
extern int v4l_get_mbuf(v4l_device *);
extern int v4l_get_picture(v4l_device *);
extern int v4l_grab_picture(v4l_device *, unsigned int);
extern int v4l_set_buffer(v4l_device *);
extern int v4l_get_buffer(v4l_device *);
extern int v4l_switch_channel(v4l_device *, int);
3.Video4linux支持的數(shù)據(jù)結(jié)構(gòu)及其用途
(1)video_capability 包含設(shè)備的基本信息(設(shè)備名稱、支持的最大最小分辨
率、信號(hào)源信息等)
name[32] 設(shè)備名稱
maxwidth
maxheight
minwidth
minheight
Channels 信號(hào)源個(gè)數(shù)
type 是否能capture , 彩色還是黑白, 是否能裁剪等等。值如
VID_TYPE_CAPTURE等
(2)video_picture 設(shè)備采集的圖象的各種屬性
Brightness 0~65535
hue
colour
contrast
whiteness
depth 8 16 24 32
palette VIDEO_PALETTE_RGB24 | VIDEO_PALETTE_RGB565|
VIDEO_PALETTE_JPEG| VIDEO_PALETTE_RGB32
(3)video_channel 關(guān)于各個(gè)信號(hào)源的屬性
Channel 信號(hào)源的編號(hào)
name
tuners
Type VIDEO_TYPE_TV | IDEO_TYPE_CAMERA
Norm 制式 PAL|NSTC|SECAM|AUTO
(4)video_window 包含關(guān)于capture area的信息
x x windows 中的坐標(biāo).
y y windows 中的坐標(biāo).
width The width of the image capture.
height The height of the image capture.
chromakey A host order RGB32 value for the chroma key.
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 6 -
flags Additional capture flags.
clips A list of clipping rectangles. (Set only)
clipcount The number of clipping rectangles. (Set only)
(5)video_mbuf 利用mmap進(jìn)行映射的幀的信息
size 每幀大小
Frames 最多支持的幀數(shù)
Offsets 每幀相對(duì)基址的偏移
(6)video_mmap 用于mmap
4.關(guān)鍵步驟介紹
【注】接多個(gè)攝像頭。方法如下:買一個(gè)usb hub接到開(kāi)發(fā)板的usb host上。cat
/proc/devices可以知道video capture device的major是81,再ls –l /dev看到video0
的次設(shè)備號(hào)是0。兩個(gè)攝像頭當(dāng)然要兩個(gè)設(shè)備號(hào),所以mknod /dev/video1 c 81 1,
如果接4個(gè),就mknod /dev/video2 c 81 2,mknod /dev/video3 c 81 3。依次類推。
(1)打開(kāi)視頻:
int v4l_open(char *dev, v4l_device *vd)
{
if (!dev)
dev = ”/dev/video0”;
if ((vd ->fd = open(dev, O_RDWR)) < 0) {
perror("v4l_open:");
return -1;
}
if (v4l_get_capability(vd))
return -1;
if (v4l_get_picture(vd))
retu rn -1;
return 0;
}
(2)讀video_capability 中信息
int v4l_get_capability(v4l_device *vd)
{
if (ioctl(vd ->fd, VIDIOCGCAP, &(vd->capability)) < 0) {
perror("v4l_get_capability:");
return -1;
}
return 0;
}
成功后可讀取vd->capability各分量
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 7 -
(3)讀video_picture中信息
int v4l_get_picture(v4l_device *vd)
{
if (ioctl(vd ->fd, VIDIOCGPICT, &(vd->picture)) < 0) {
perror("v4l_get_picture:");
return -1;
}
return 0;
}
成功后可讀取圖像的屬性
(4)改變video_picture中分量的值 (可以不做的)
先為分量賦新值,再調(diào)用VIDIOCSPICT
vd->picture.colour = 65535;
if(ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0)
{
perror("VIDIOCSPICT");
return -1;
}
(5)初始化channel (可以不做的)
必須先做得到vd->capability中的信息
int v4l_get_channels(v4l_device *vd)
{
int i;
for (i = 0; i < vd ->capability.channels; i++) {
vd ->channel.channel = i;
if (ioctl(vd ->fd, VIDIOCGCHAN, &(vd->channel)) < 0) {
perror("v4l_get_channel:");
return -1;
}
}
return 0;
}
(6)關(guān)閉設(shè)備
int v4l_close(v4l_device *vd)
{
close(vd ->fd);
return 0;
}
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 8 -
重點(diǎn):截取圖象的兩種方法
一、用mmap(內(nèi)存映射)方式截取視頻
mmap( )系統(tǒng)調(diào)用使得進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普
通文件被映射到進(jìn)程地址空間后,進(jìn)程可以向訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪
問(wèn),不必再調(diào)用read(),write()等操作。兩個(gè)不同進(jìn)程A、B共享內(nèi)存的意思是,
同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)
程B對(duì)共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。
采用共享內(nèi)存通信的一個(gè)顯而易見(jiàn)的好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫
內(nèi)存,而不需要任何數(shù)據(jù)的拷貝
(1)設(shè)置picture的屬性
(2) 初始化video_mbuf,以得到所映射的buffer的信息
ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))
(3)可以修改video_mmap和幀狀態(tài)的當(dāng)前設(shè)置
(4)將mmap與video_mbuf綁定
void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
len:映射到調(diào)用進(jìn)程地址空間的字節(jié)數(shù),它從被映射文件開(kāi)頭offset個(gè)字節(jié)開(kāi)始
算起
Prot:指定共享內(nèi)存的訪問(wèn)權(quán)限 PROT_READ(可 讀), PROT_WRITE (可寫),
PROT_EXEC (可執(zhí)行)
Flags:MAP_SHARED MAP_PRIVATE中必選一個(gè),MAP_ FIXED不推薦使用
Addr:共內(nèi)存享的起始地址,一般設(shè)0,表示由系統(tǒng)分配
Mmap( ) 返回值是系統(tǒng)實(shí)際分配的起始地址
int v4l_mmap_init(v4l_device *vd)
{
if (v4l_get_mbuf(vd) < 0)
return -1;
if ((vd ->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE,
MAP_SHARED, vd->fd, 0)) < 0) {
perror("v4 l_mmap_init:mmap");
return -1;
}
return 0;
}
(5)Mmap方式下真正做視頻截取的 VIDIOCMCAPTURE
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 9 -
ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) ;
若調(diào)用成功,開(kāi)始一幀的截取,是非阻塞的,
是否截取完畢留給VIDIOCSYNC來(lái)判斷
(6)調(diào)用VIDIOCSYNC等待一幀截取結(jié)束
if(ioctl(vd->fd, VIDIOCSYNC, &frame) < 0)
{
perror("v4l_sync:VIDIOCSYNC");
return -1;
}
若成功,表明一幀截取已完成??梢蚤_(kāi)始做下一次 VIDIOCMCAPTURE
frame是當(dāng)前截取的幀的序號(hào)。
********關(guān)于雙緩沖************
video_bmuf bmuf.frames = 2;一幀被處理時(shí)可以采集另一幀
int frame; //當(dāng)前采集的是哪一幀
int framestat[2]; //幀的狀態(tài) 沒(méi)開(kāi)始采集|等待采集結(jié)束
幀的地址由vd->map + vd->mbuf.offsets[vd->frame]得到。
采集工作結(jié)束后調(diào)用munmap取消綁定
munmap(vd->map, vd->mbuf.size)
在實(shí)際應(yīng)用時(shí)還可以采用緩沖隊(duì)列等方式。
二、視頻截取的第二種方法:直接讀設(shè)備
關(guān)于緩沖大小,圖象等的屬性須由使用者事先設(shè)置
調(diào)用read();
int read (要訪問(wèn)的文件描述符;指向要讀寫的信息的指針;應(yīng)該讀寫的字符數(shù));
返回值為實(shí)際讀寫的字符數(shù)
int len ;
unsigned char
*vd->map=
(unsigned char *) malloc(vd?capability.maxwidth*vd?capability.maxheight );
len = read(vd?fd,vd? vd->map,
vd?capability.maxwidth*vd?capability.maxheight*3 );
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 10 -
2.3 編程實(shí)例(mouse_capture)
不管是ov511還是zc301的攝像頭,它們采集的方式都是相同的,只不過(guò)采集
到的數(shù)據(jù)有所差異,ov511的就是rgb的位流,而zc301是jpeg編碼的位流。
mouse_capture是根據(jù)servfox改編的一個(gè)專門從zc301攝像頭獲取一張jpeg圖片,
用來(lái)測(cè)試攝像頭是否加載成功的小程序。這樣就可以不用cat /dev/video0>1.jpg來(lái)
測(cè)試攝像頭是否正常。cat命令一運(yùn)行,就源源不斷地采集jpeg流。但是采到的圖
片只能顯示第一個(gè)jpeg頭和jpeg尾之間的數(shù)據(jù)。mouse_capture僅僅獲得一張完整
的jpeg。 可以從
http://www.hhcn.com/cgi-bin/topic.cgi?forum=1&topic=247&start=144&show=0
處下載參考。
現(xiàn)將主要函數(shù)的功能介紹如下:
static int GetVideoPict (struct vdIn *vd);//獲取圖片屬性信息。
static int SetVideoPict (struct vdIn *vd);//設(shè)置圖片屬性。
static int isSpcaChip (const char *BridgeName);//測(cè)試芯片類型
static int GetStreamId (const char *BridgeName); //測(cè)試輸出數(shù)據(jù)的格式
static int GetDepth (int format);//獲取顏色深度。
void exit_fatal(char *messages);//錯(cuò)誤顯示。
int init_videoIn(struct vdIn *vd,char *device,int width,int height,int format,int
grabmethod);//初始化設(shè)備。
int convertframe(unsigned char *dst,unsigned char *src, int width,int height, int
formatIn, int size);//把共享緩沖區(qū)中的數(shù)據(jù)放到一個(gè)變量中,通知系統(tǒng)已獲得一
幀。
int v4lGrab (struct vdIn *vd,char *filename );//從攝像頭采集圖片。
int close_v4l (struct vdIn *vd);//關(guān)閉攝像頭。
int get_jpegsize (unsigned char *buf, int insize);//獲取jpeg圖片大小。
三 實(shí)例程序
3.1 LCD 實(shí)時(shí)顯示從ov511 上采集的圖像
參考HHARM9-EDU/applications/usbcam2lcd。從攝像頭獲取bmp位流直接顯示
在framebuffer中。此程序圖像的采集采用read的方式,注意由于lcd液晶屏顯示的
是16bits的RGB圖片,所以,ov511輸出的圖片格式也應(yīng)該是16bits的RGB圖片數(shù)
據(jù),宏VIDEO_PALETTE_RGB565定義的就是16bits的RGB數(shù)據(jù)圖片。而linux自
帶的ov511驅(qū)動(dòng)中圖像采集是32位的,這樣采集到的圖片顯示在lcd上是雪花點(diǎn)。
因此需要修改驅(qū)動(dòng)。 在kernet/driver/usb/目錄下有ov511芯片的驅(qū)動(dòng)ov511.c,驅(qū)
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 11 -
動(dòng)里的ov51x_set_default_params函數(shù)是設(shè)置芯片默認(rèn)的輸出圖片的格式,該函數(shù)
中的
for (i = 0; i < OV511_NUMFRAMES; i++)
{
ov511->frame.width = ov511->maxwidth;
ov511->frame.height = ov511->maxheight;
ov511->frame.bytes_read = 0;
if (force_palette)
ov511->frame.format = force_palette;
else
ov511->frame.format = VIDEO_PALETTE_RGB24;
ov511->frame.depth = ov511_get_depth(ov511->frame.format);
}
部分語(yǔ)句是主要設(shè)置ov511默認(rèn)輸出圖片格式的,其中maxwidth和maxheight
設(shè)置了圖片的最大的寬度和高度。Ifelse語(yǔ)句設(shè)置了圖片的格式,作如下的修改:
for (i = 0; i < OV511_NUMFRAMES; i++)
{
ov511->frame.width = ov511->maxwidth;
ov511->frame.height = ov511->maxheight;
ov511->frame.bytes_read = 0;
ov511->frame.format = VIDEO_PALETTE_RGB565;
ov511->frame.depth = ov511_get_depth(ov511->frame.format);
}
如果需要,也可以改變圖片的默認(rèn)輸出大小。
3.2 LCD 實(shí)時(shí)顯示從zc301 上采集的圖像
編程思想:從攝像頭采集到的圖片存放在本地文件夾,通過(guò)minigui加載jpeg
來(lái)實(shí)現(xiàn)顯示。
具體過(guò)程:
1.從網(wǎng)上下載jpegsrc-6b的jpeg庫(kù),交叉編譯。
(1)./configure –enable-static –enable-shared –prefix=.libs
(2)修改Makefile,將編譯器改成交叉編譯器。
例如:我改成/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
(3)make 后即在.libs目錄中生成for arm的
libjpeg.a, libjpeg.la,libjpeg.so,libjpeg.so.62,libjpeg.so.62.0.0。將這些文件拷貝到系
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 12 -
統(tǒng)庫(kù)文件目錄,我的是/usr/lib中。
2.因?yàn)榭磸膠c301采集的圖片的二進(jìn)制位流,jpeg頭是ff d8 ff db。而在minigui庫(kù)
文件libminigui的源文件src/mybmp/jpeg.c中,load_jpg和check_jpg的時(shí)候測(cè)試的頭
位EXIF和JFIF兩種格式的jpeg圖片。這兩種對(duì)應(yīng)的二進(jìn)制分別是ff d8 ff e1和ff d8
ff e0。所以我們minigui通過(guò)判斷認(rèn)為這是錯(cuò)誤的jpeg格式而不加載,故無(wú)法顯示。
實(shí)際上通過(guò)測(cè)試,在源碼中去掉這兩個(gè)判斷就能正確加載。
3.交叉編譯minigui
( 1 ) 編譯庫(kù): ./configure --host=arm-unknown-linux --enable-jpgsupport=yes
--enable-pngsupport=no --enable-gifsupport=no --disable-lite
--prefix=/HHARM9-EDU/applications/minigui-free/nfsroot
--enable-smdk2410ial=yes
make
make install
(2)編譯實(shí)例程序時(shí),要加上jpeg庫(kù)的支持,即在Makefile中加上-ljpeg。此時(shí)
將在nfsroot生成的庫(kù)文件和可執(zhí)行文件移到ramdisk.image.gz相應(yīng)的目錄下。(具
體參考華恒的2410開(kāi)發(fā)手冊(cè))。
3.Minigui程序的編寫
編程小技巧,我采取的方法是一刻不停地從攝像頭采集到圖片存儲(chǔ)在
/tmp/1.jpg中,在minigui中通過(guò)loadbitmap函數(shù)來(lái)加載圖片。而圖片加載后不會(huì)自
動(dòng)更新,不能自動(dòng)根據(jù)1.jpg的改變自動(dòng)變化。因此,我在程序中設(shè)定一個(gè)timer。
每隔100ms刷新屏幕,基本上實(shí)現(xiàn)實(shí)時(shí)更新了。而出現(xiàn)另外一個(gè)問(wèn)題,刷新時(shí)會(huì)
以背景色來(lái)填充桌面,導(dǎo)致屏幕閃爍嚴(yán)重。故想到采用MSG_ERASEBKGND的
方式,用前一張圖片做為刷新屏幕時(shí)的填充背景圖片。這樣就保證了lcd上圖像
的連續(xù)性啦。
Minigui程序如下:其中一些自定義的函數(shù)跟mouse_capture中的一樣,只是
變采集單幅到采集多幅。具體您可以自己改一下:)。也可以向我索取源碼。
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include "spcav4l.h"
#define IDTIMER 100
static BITMAP bmp;
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 13 -
static int LoadBmpWinProc(HWND hWnd, int message, WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
RECT rc={0,0,240,320};
switch (message) {
case MSG_CREATE:
SetTimer(hWnd,IDTIMER,100);
return 0;
case MSG_ERASEBKGND:
{
RECT rcTemp;
if( LoadBitmap(HDC_SCREEN,&bmp,"/tmp/1.jpg"))
{
printf("load wrong!\n");
return -1;
}
GetClientRect(hWnd, &rcTemp);
hdc = BeginPaint (hWnd);
FillBoxWithBitmap (hdc, rcTemp.left, rcTemp.top, rcTemp.right-rcTemp.left,
rcTemp.bottom-rcTemp.top, &bmp);
EndPaint(hWnd, hdc);
return 0;
}
case MSG_TIMER:
InvalidateRect(hWnd,&rc,TRUE);
return 0;
case MSG_CLOSE:
UnloadBitmap (&bmp);
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
char videodevice[] = "/dev/video0";
char jpegfile[] = "/tmp/1.jpg";
int grabmethod = 0;
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 14 -
int format = VIDEO_PALETTE_JPEG;
int width = 240;
int height = 320;
int i;
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "Load and display a bitmap";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = LoadBmpWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 320;
CreateInfo.iBkColor = PIXEL_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow (hMainWnd, SW_SHOWNORMAL);
memset(&videoIn, 0, sizeof (struct vdIn));
if(init_videoIn(&videoIn, videodevice, width, height, format,grabmethod) == 0)
{
printf("init is ok!\n");
}
else printf("init is wrong!\n");
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
v4lGrab(&videoIn, jpegfile);
DispatchMessage(&Msg);
}
close_v4l (&videoIn);
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _LITE_VERSION
#include <minigui/dti.c>
#endif
基于Video4Linux 的USB 攝像頭圖像采集實(shí)現(xiàn) 戴小鼠 daily3
- 15 -
先寫到這里吧,呵呵,希望能對(duì)您有所幫助。如果您在閱讀的過(guò)程中發(fā)現(xiàn)問(wèn)
題,歡迎和我交流。
2006-7-7 晚
參考文獻(xiàn)
1.HHARM2410攝像頭調(diào)試記錄 華恒科技
2.基于video4linux的視頻設(shè)備編程 Lingzhi_Shi Apr 7 2004
3.《video4linux programming》 Alan Cox
4.《video streaming 探討》 陳俊宏
5.《Video4Linux Kernel API Reference 》
6.http://www.hhcn.com/cgi-bin/topic.cgi?forum=1&topic=247&show=0 
     Copyright ? 深圳市聚泓瀚科技有限公司 保留所有權(quán)利      備案號(hào):粵ICP備18062864號(hào)    Powered By 博盈網(wǎng)絡(luò)營(yíng)銷     
咨詢熱線:
13923733903
在線客服:
小孟
客服在線
翁生
官方微信站:
公司官網(wǎng): yqmpw.cn