如何利用Video4Linux獲取攝像頭資料

2021-05-25 11:38:13 字數 3171 閱讀 1051

1. 攝像頭的安裝

在 linux下常用的攝像頭驅動是spca5xx,這是乙個通用驅動,讀者可以在以下**下到這個驅動 這個**還給出了這款驅動支援的攝像頭的種類。另外,ov511晶元直接就支援linux,使用者款晶元的攝像頭有網眼v2000。我使用的是網眼v2000的攝像頭,和z-star 301p+現代7131r晶元的攝像頭。後一種需要spca5xx的驅動。關於spca5xx的安裝方法,網上有很多介紹,這裡就不說了。

2. 攝像頭的除錯

3. video4linux 程式設計獲取資料

a> 開啟裝置

b> 設定裝置的屬性,比如影象的亮度,對比度等等

c> 設定傳輸格式和傳輸方式

d> 開始傳輸資料,一般是乙個迴圈,用以連續的傳輸資料

e> 關閉裝置

下面具體介紹v4l程式設計的過程。首先指出,在video4linux程式設計時要包含標頭檔案,其中包含了video4linux的資料結構和函式定義。

1)v4l的資料結構

在video4linux api中定義了如下資料結構,詳細的資料結構定義可以參考v4l api的文件,這裡就程式設計中經常使用的資料結構作出說明。

首先我們定義乙個描述裝置的資料結構,它包含了v4l中定義的所有資料結構:

typedef

struct _v4ldevicev4ldevice;  

下面解釋上面這個資料結構中包含的資料結構,這些結構的定義都在中。

這乙個資料結構是包含了攝像頭的屬性,name是攝像頭的名字,maxwidth maxheight是攝像頭所能獲取的最大影象大小,用畫素作單位。

在程式中,通過ioctl函式的vidiocgcap控制命令讀寫裝置通道已獲取這個結構,有關ioctl的使用,比較複雜,這裡就不說了。下面列出獲取這一資料結構的**:

int v4lgetcapability(v4ldevice *vd)  

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)return 0;  

}

unsigned char *v4lgetaddress(v4ldevice *vd) 

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)  

為了更好的理解原始碼,這裡給出裡面的函式的實現,這裡為了簡化,將所有的出錯處理都去掉了。

int v4lopen(char *name, v4ldevice *vd)  

if(v4lgetcapability(vd))  

return -1;  

}  int v4lgrabinit(v4ldevice *vd, int width, int height)  

int v4lmmap(v4ldevice *vd)  

return 0;  

}  int v4lgrabstart(v4ldevice *vd, int frame)  

vd->framestat[frame] = 1;  

return 0;  

}  int v4lsync(v4ldevice *vd, int frame)  

vd->framestat[frame] = 0;  

return 0;  

}  int c4lcapture(v4ldevice *vd, int frame)  

vd->framestat[frame] = 1;  

return 0;  

}

原文:

基於Video4Linux的攝像頭驅動設計

0 引言 1 video4linux 目前,v4l這套介面已發展為v4l 2,前者比後者簡單,但 存在兩個不足之處 驅動程式設計時不能同時開啟多個裝置 現存的v4l api不能很好地支援帶編碼能力的裝置。本文為便於研究攝像頭驅動開發,還是使用v4l。v4l主要結構體如下 v4l支援兩種方式捕獲影象 ...

Xcode4的使用 如何利用Instruments

下面僅僅說明的是 從xcode4上去觀察評測當前專案 進入xcode4,選擇選單 product profile 快捷鍵command i 使用這種方式,必須寫正常的邏輯 不能使用nslog來實際觀察。如果要使用nslog來debug,並使用instruments來偵測,那麼應該 1 將需要偵測和d...

linux如何利用crontab新增定時任務詳解

前言 linux 系統是由 crond這個系統服務來控制的。linux 系統上面原本就有非常多的計畫性工作,因此這個系統服務是預設啟動的。crontab命令用於設定週期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於 crontab 檔案中,以供之後讀取和執行。我們可以看下crond這個系...