V4L基礎概念

2021-06-02 21:24:08 字數 3353 閱讀 5198

1.video4linux基礎相關

1.1 v4l的介紹與一些基礎知識的介紹

i.首先說明一下video4linux(v4l)。

ii.linux系統中的檔案操作

1.2 建立一套簡單的v4l函式庫

這裡先給出接下來將要開發出來函式的乙個總覽。

相關結構體和函式的定義我們就放到乙個名為v4l.h的檔案中,相關函式的編寫就放在乙個名為v4l.c的檔案中把。

對於這個函式庫共有如下的定義(也就是大體v4l.h中的內容):

#ifndef _v4l_h_

#define _v4l_h_

#include #include //使用v4l必須包含的標頭檔案

這個標頭檔案可以在/usr/include/linux下找到,裡面包含了對v4l各種結構的定義,以及各種ioctl的使用方法,所以在下文中有關v4l的相關結構體並不做詳細的介紹,可以參看此檔案就會得到你想要的內容。

下面是定義的結構體,和相關函式,突然給出這麼多的**很唐突,不過隨著一點點解釋條理就會很清晰了。

struct _v4l_struct

;typedef struct _v4l_struct v4l_device;

//上面的定義的結構體,有的文中章有定義channel的變數,但對於攝像頭來說設定這個變數意義不大通常只有乙個channel,本文不是為了寫出乙個大而全且成熟的函式庫,只是為了介紹如何使用v4l,再加上本人水平也有限,能夠給讀者乙個路線我就很知足了,所以並沒有設定這個變數同時與channel相關的函式也沒有給出。

extern int v4l_open(char *, v4l_device *);

extern int v4l_close(v4l_device *);

extern int v4l_get_capability(v4l_device *);

extern int v4l_get_picture(v4l_device *);

extern int v4l_get_mbuf(v4l_device *);

extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);

extern int v4l_grab_picture(v4l_device *, unsigned int);

extern int v4l_mmap_init(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 *);

上述函式會在下文中逐漸完成,功能也會逐漸介紹,雖然現在看起來沒什麼感覺只能從函式名上依稀體會它的功能,或許看起來很煩,不過看完下文就會好了。

2.獲得裝置資訊。

3.根據需要更改裝置的相關設定。

4.獲得採集到的影象資料(在這裡v4l提供了兩種方式,直接通過開啟的裝置讀取資料,使用mmap記憶體對映的方式獲取資料)。

5.對採集到的資料進行操作(如顯示到螢幕,影象處理,儲存成檔案)。

知道了流程之後,我們就需要根據流程完成相應的函式。

具體的函式如下

#define default_device 「/dev/video0」

int v4l_open(char *dev , v4l_device *vd)

if(v4l_get_capability(vd))return -1;

if(v4l_get_picture(vd))return -1;//這兩個函式就是即將要完成的獲取裝置資訊的函式

return 0

}同樣對於第6步也十分簡單,就是int v4l_close(v4l_device *);的作用。

函式如下:

int v4l_close(v4l_device *vd)

現在我們完成第2步中獲得裝置資訊的任務,下面先給出函式在對函式作出相應的說明。

int v4l_get_capability(v4l_device *vd)

return 0;

}int v4l_get_picture(v4l_device *vd)

return 0;

}struct video_capability

picture結構包括了亮度,對比度,色深,調色盤等等資訊。標頭檔案裡還列出了palette相關的值,這裡並沒有給出。

這裡直接給出另外乙個函式

int v4l_get_mbuf(v4l_device *vd)

return 0;

}int v4l_get_mbuf(v4l_device *vd)

return 0;

}對於結構體video_mbuf在v4l中的定義如下,video_mbuf結構體是為了服務使用mmap記憶體對映來獲取影象的方法而設定的結構體,通過這個結構體可以獲得攝像頭裝置儲存影象的記憶體大小。具體的定義如下,各變數的使用也會在下文詳細說明。

struct video_mbuf

;下面完成第3步按照需要更改裝置的相應設定,事實上可以更改的設定很多,本文以更改picture屬性為例說明更改屬性的一般方法。

那麼我們就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);這個函式吧

int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)

return 0;

}int v4l_get_mbuf(v4l_device *vd)

return 0;

}對於結構體video_mbuf在v4l中的定義如下,video_mbuf結構體是為了服務使用mmap記憶體對映來獲取影象的方法而設定的結構體,通過這個結構體可以獲得攝像頭裝置儲存影象的記憶體大小。具體的定義如下,各變數的使用也會在下文詳細說明。

struct video_mbuf

;下面完成第3步按照需要更改裝置的相應設定,事實上可以更改的設定很多,本文以更改picture屬性為例說明更改屬性的一般方法。

那麼我們就完成extern int v4l_set_picture(v4l_device *, int, int, int, int, int,);這個函式吧

int v4l_set_picture(v4l_device *vd,int br,int hue,int col,int cont,int white)

return 0;

}上述函式就是更改picture相關屬性的例子,其核心還是v4l給我們提供的ioctl的相關呼叫,通過這個函式可以修改如亮度,對比度等相關的值。

v4l程式設計基礎

我們都知道,在linux中,為了遮蔽使用者對裝置訪問的複雜性,採用了裝置檔案,即可以通過 像訪問普通檔案一樣的方式來對裝置進行訪問讀寫。電視卡在linux中和印表機,滑鼠一樣,屬於字元 裝置。其主裝置號是81,在實際操作上,訪問控制電視卡也和一般的裝置檔案沒有什麼不同。用open 開啟裝置,int ...

V4L 簡介及其與V4L2區別

由於早期的 v4l 有很多缺陷,bill dirks 等人對其進行了重新設計,並取名為video for linux 2 v4l2使用 最早出現於linux2.5.x 版本。v4l2 相比於v4l 有更好的擴充套件性和靈活性,並且支援的硬體裝置更多。因此在應用程式v4l程式設計實際是指v4l2,我們...

v4l2框架v4l2 device API分析

涉及到的結構體 struct v4l2 device在v4l2框架中充當所有v4l2 subdev的父裝置,管理著註冊在其下的子裝置 struct v4l2 device struct device 代表子裝置,包含了子裝置的相關屬性和操作 struct device struct subdev s...