『壹』 如何利用Video4linux獲取攝像頭數據
1. 攝像頭的安裝
在Linux下常用的攝像頭驅動是spca5xx。這個網站還給出了這款驅動支持的攝像頭的種類。另外,ov511晶元直接就支持Linux,使用者款晶元的攝像頭有網眼V2000。我使用的是網眼V2000的攝像頭,和Z-Star
301p+現代7131R晶元的攝像頭。後一種需要spca5xx的驅動。關於spca5xx的安裝方法,網上有很多介紹,這里就不說了。
2. 攝像頭的調試
安裝好攝像頭後,為了測試攝像頭能否正常工作,可以用一下軟體。比較著名的是xawtv,在網上搜以下可以下載到。安裝好後,打開xawtv則可以調試攝像頭。
3. Video4Linux 編程獲取數據
現有的video4linux有兩個版本,v4l和v4l2。本文主要是關於v4l的編程。利用v4l API獲取視頻圖像一般有以下幾步:
a> 打開設備
b> 設置設備的屬性,比如圖像的亮度,對比度等等
c> 設定傳輸格式和傳輸方式
d> 開始傳輸數據,一般是一個循環,用以連續的傳輸數據
e> 關閉設備
下面具體介紹v4l編程的過程。首先指出,在video4linux編程時要包含頭文件,其中包含了video4linux的數據結構和函數定義。
1)v4l的數據結構
在video4linux API中定義了如下數據結構,詳細的數據結構定義可以參考v4l API的文檔,這里就編程中經常使用的數據結構作出說明。
首先我們定義一個描述設備的數據結構,它包含了v4l中定義的所有數據結構:
typedef struct
_v4ldevice
{int fd;//設備號
struct video_capability capability;
struct
video_channel channel[10];
struct video_picture picture;
struct video_clip
clip;
struct video_window window;
struct video_capture capture;
struct
video_buffer buffer;
struct video_mmap mmap;
struct video_mbuf
mbuf;
struct video_unit unit;
unsigned char
*map;//mmap方式獲取數據時,數據的首地址
pthread_mutex_t mutex;
int frame;
int
framestat[2];
int overlay;
}v4ldevice;
下面解釋上面這個數據結構中包含的數據結構,這些結構的定義都在中。
* struct
video_capability
name[32] Canonical name for this interface
type Type of
interface
channels Number of radio/tv channels if appropriate
audios
Number of audio devices if appropriate
maxwidth Maximum capture width in
pixels
maxheight Maximum capture height in pixels
minwidth Minimum capture
width in pixels
minheight Minimum capture height in pixels
這一個數據結構是包含了攝像頭的屬性,name是攝像頭的名字,maxwidth maxheight是攝像頭所能獲取的最大圖像大小,用像素作單位。
在程序中,通過ioctl函數的VIDIOCGCAP控制命令讀寫設備通道已獲取這個結構,有關ioctl的使用,比較復雜,這里就不說了。下面列出獲取這一數據結構的代碼:
int v4lgetcapability(v4ldevice *vd)
{
if(ioctl(vd->fd,
VIDIOCGCAP, &(vd->capability)) < 0)
{
v4lperror("v4lopen:VIDIOCGCAP");
return -1;
}
return 0;
}
*
struct video_picture
brightness Picture brightness
hue Picture hue (colour
only)
colour Picture colour (colour only)
contrast Picture
contrast
whiteness The whiteness (greyscale only)
depth The capture depth
(may need to match the frame buffer depth)
palette Reports the palette that
should be used for this image
這個數據結構主要定義了圖像的屬性,諸如亮度,對比度,等等。這一結構的獲取通過ioctl發出VIDIOCGPICT控制命令獲取。
* struct video_mbuf
size The number of bytes to
map
frames The number of frames
offsets The offset of each frame
這個數據結構在用mmap方式獲取數據時很重要:
size表示圖像的大小,如果是640*480的彩色圖像,size=640*480*3
frames表示幀數
offsets表示每一幀在內存中的偏移地址,通過這個值可以得到數據在圖像中的地址。
得到這個結構的數據可以用ioctl的VIDIOCGMBUF命令。源碼如下:
int v4lgetmbuf(v4ldevice
*vd)
{
if(ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))<0)
{
v4lperror("v4lgetmbuf:VIDIOCGMBUF");
return -1;
}
return
0;
}
而數據的地址可以有以下方式計算:
unsigned char
*v4lgetaddress(v4ldevice *vd)
{
return (vd->map +
vd->mbuf.offsets[vd->frame]);
}
2)獲取影像mmap方式。
在video4Linux下獲取影像有兩種方式:overlay和mmap。由於我的攝像頭不支持overlay方式,所以這里只談mmap方式。
mmap方式是通過內存映射的方式獲取數據,系統調用ioctl的VIDIOCMCAPTURE後,將圖像映射到內存中,然後可以通過前面的v4lgetmbuf(vd)函數和v4lgetaddress(vd)函數獲得數據的首地址,這是李可以選擇是將它顯示出來還是放到別的什麼地方。
下面給出獲取連續影像的最簡單的方法(為了簡化,將一些可去掉的屬性操作都去掉了):
char*
devicename="/dev/video0";
char* buffer;
v4ldevice device;
int width =
640;
int height = 480;
int frame =
0;
v4lopen("/dev/video0",&device);//打開設備
v4lgrabinit(&device,width,height);//初始化設備,定義獲取的影像的大小
v4lmmap(&device);//內存映射
v4lgrabstart(&device,frame);//開始獲取影像
while(1){
v4lsync(&device,frame);//等待傳完一幀
frame
= (frame+1)%2;//下一幀的frame
v4lcapture(&device,frame);//獲取下一幀
buffer =
(char*)v4lgetaddress(&device);//得到這一幀的地址
//buffer給出了圖像的首地址,你可以選擇將圖像顯示或保存......
//圖像的大小為
width*height*3
..........................
}
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
『貳』 v4l-utils設置攝像頭曝光參數
客戶需要設置android usb攝像頭曝光參數
Video4Linux(V4L)是Linux中關於視頻設備的內核驅動,它為針對視頻設備的應用程序編 程提供一系列介面函數,這些視頻設備包括現今市場上流行的TV卡、視頻捕捉卡和USB攝像頭等。對於USB口攝像頭,其驅動程序中需要提供基本的I/O操 作介面函數open、read、write、close的實現.
android下使用v4l-utils,需要v4l-utils源碼交叉編譯Android的v4l-utils軟體, 命令使用方法同上.
『叄』 利用linux的V4L獲取圖像數據時,用READ和MMAP兩種方式的一些不理解
使用read和write需要在用戶進程的緩沖和內核的緩沖區之間進行一次數據的拷貝過程是非常的浪費CPU的。而使用mmap可以將內核的緩沖區直接的映射在用戶的進程內存中,減少了一次無價值的數據復制過程。
『肆』 Linux下OpenCV 、V4L、MJPG-streamer的區別及應用相關問題,有點糊塗!
V4L是內核中的視頻驅動框架,比如驅動電視機。
這個框架又包括用戶需要的一系列API,好吧,這個API很復雜,你可以去V4L的官網看看。
MJPG-streamer,MJPG是一種視頻編碼格式,用於存儲視頻,網路傳輸視頻的一種格式,所以本地顯示視頻前需要解碼。V4L框架已經包含了硬體解碼模塊,所以你可以用V4L的API播放視頻。
OpenCV 那就更高層了,你用opencv播放視頻只需要幾個函數就可以了,因為內部幫你做好了一切,你只需要控制邏輯就行了,opencv主要是用於視頻智能分析的,比如移動偵測,手勢控制等等。
『伍』 請教各位大蝦,linux怎樣查看系統是支持v4l2還是v4l啊
查看系統/usr/include 下面的頭文件,,<linux/videodev2.h>就說明支持v4l2
<linux/videodev.h> 支持v4l
一般情況下,只有其中的一個頭文件
不過很多系統已經不支持v4l 了,,ubuntu就是的,,,
『陸』 V4L的定義
video4linux(v4l)是一些視頻系統,視頻軟體,音頻軟體的基礎,經常使用在需要採集圖像的場合,如視頻監控,webcam,可視電話,經常應用在embedded linux中是linux嵌入式開發中經常使用的系統介面。它是linux內核提供給用戶空間的編程介面,各種的視頻和音頻設備開發相應的驅動程序後,就可以通過v4l提供的系統API來控制視頻和音頻設備,也就是說v4l分為兩層,底層為音視頻設備在內核中的驅動,上層為系統提供的API,而對於我們來說需要的就是使用這些系統的API。
『柒』 V4L的簡介
II.Linux系統中的文件操作
有關Linux系統中的文件操作不屬於本文的內容。但是還是要了解相關系統調用的作用和使用方法。其中包括open(),read(),close(),ioctl(),mmap()。詳細的使用不作說明。在Linux系統中各種設備(當然包括視頻設備)也都是用文件的形式來使用的。他們存在與dev目錄下,所以本質上說,在Linux中各種外設的使用(如果它們已經正確的被驅動),與文件操作本質上是沒有什麼區別的。
現在出現Video4Linux2 (Video for Linux Two),簡稱V4L2。很顯然,他是V4L的改進版,修復了第一代的部分設計bug。從2.5.x開始,V4L2就被集成到內核裡面去了。盡管如此,還是有一部分設備的驅動不支持新版本的V4L2,所以,有時候我們會看到V4L跟V4L2同時出現在代碼裡面。
可參考網路詞條:Video4Linux,或者擴展閱讀部分。
『捌』 在linux下寫v4l,編譯的時候出現error: expected 『;』, 『,』 or 『)』 before numeric constant
語法錯誤,最好找的錯誤了
『玖』 5、從SAP通過變形推理可否推出OS
第一、操作系統層(OS)
第二、各種庫(Libraries)和Android 運行環境(RunTime)
第三、應用程序框架(Application Framework)
第四、應用程序(Application)
以下分別介紹Andoid各個層次的軟體的重點及其相關技術:
1.操作系統層(OS)
Android基於Linux 2.6提供核心系統服務,例如:安全、內存管理、進程管理、網路堆棧、驅動模型。Linux Kernel也作為硬體和軟體之間的抽象層,它隱藏具體硬體細節而為上層提供統一的服務。
如果你學過計算機網路知道OSI/RM,就會知道分層的好處就是使用下層提供的服務而為上層提供統一的服務,屏蔽本層及以下層的差異,當本層及以下層發生了變化不會影響到上層。也就是說 各層各司其職,各層提供固定的SAP(Service Access Point),專業點可以說是 高內聚、低耦合。
如果你只是做應用開發,就不需要深入了解Linux Kernel層。
顯示驅動(Display Driver):常用基於Linux的幀緩沖(Frame Buffer)驅動。
Flash內存驅動(Flash Memory Driver)
照相機驅動(Camera Driver):常用基於Linux的v4l(Video for )驅動。
音頻驅動(Audio Driver):常用基於ALSA(Advanced Linux Sound Architecture,高級Linux聲音體系)驅動。
WiFi驅動(Camera Driver):基於IEEE 802.11標準的驅動程序
鍵盤驅動(KeyBoard Driver)
藍牙驅動(Bluetooth Driver)
Binder IPC驅動: Andoid一個特殊的驅動程序,具有單獨的設備節點,提供進程間通訊的功能。
Power Management(能源管理)
2. 各種庫(Libraries)和Android 運行環境(RunTime)
本層次對應一般嵌入式系統,相當於中間件層次。Android的本層次分成兩個部分一個是各種庫,另一個是Android 運行環境。本層的內容
大多是使用C++實現的。
在其中,各種庫包括:
▅ C庫:C語言的標准庫,這也是系統中一個最為底層的庫,C庫是通過Linux的系統調用來實現。
▅ 多媒體框架(MediaFrameword):這部分內容是Android多媒體的核心部分,基於PacketVideo(即PV)的OpenCORE,從功能上本庫一共分為兩大部分,一個部分是音頻、視頻的回放(PlayBack),另一部分是則是音視頻的紀錄(Recorder)。
▅ SGL:2D圖像引擎。
▅ SSL:即Secure Socket Layer位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。
▅ OpenGL ES 1.0 :本部分提供了對3D的支持。
▅ 界面管理工具(Surface Management):本部分提供了對管理顯示子系統等功能。
▅ SQLite:一個通用的嵌入式資料庫
▅ WebKit:網路瀏覽器的核心
▅ FreeType:點陣圖和矢量字體的功能。
Android 的各種庫一般是以系統中間件的形式提供的,它們均有的一個顯著特點就是與移動設備的平台的應用密切相關。
Android 運行環境主要指的虛擬機技術——Dalvik。Dalvik虛擬機和一般JAVA虛擬機(Java VM)不同,它執行的不是JAVA標準的位元組碼(bytecode )而是Dalvik可執行格式(.dex)中執行文件。在執行的過程中,每一個應用程序即一個進程(Linux的一個Process)。 二者最大的區別在於Java VM是以基於棧的虛擬機(Stack-based),而Dalvik是基於寄存器的虛擬機(Register-based)。顯然,後者最大的好處在於可以根據硬體實現更大的優化,這更適合移動設備的特點。
3.應用程序框架(Application Framework)
Android的應用程序框架為應用程序層的開發者提供APIs,它實際上是一個應用程序的框架。由於上層的應用程序是以JAVA構建的,因此本層次提供的首先包含了UI程序中所需要的各種控制項:
例如: Views (視圖組件)包括 lists(列表), grids(柵格), text boxes(文本框), buttons(按鈕)等。甚至一個嵌入式的Web瀏覽器。