UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已成为USB org标准之一。V853开发板内核没有开启UVC驱动,需要自行开启,重新编译。 V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video*下,如果只有一个视频设备,通常为/dev/video0。v4l2-ctl是用户空间一组用于测试,配置和使用整个相机子系统的工具,包括外部相机传感器和相机接口。v4l2-ctl 是最有用的实用工具。
v4l2-ctl基本常用的命令如下:
使用 --list-devices 选项列出所有可用的视频设备
获得有关特定设备的信息,加上 -D 选项:
- v4l2-ctl -d /dev/video1 -D
复制代码
获取受支持的参数设置接口列表
- v4l2-ctl -L -d /dev/video1
复制代码
其中可以通过 --set-ctrl 选项更改控制值,如:
- v4l2-ctl --set-ctrl test_pattern=1
复制代码
控制值可以动态更改。
设置像素格式,分辨率和帧率,使用 --list-formats-ext 选项可获取受支持的像素格式、分辨率和帧速率:
- v4l2-ctl --list-formats-ext -d /dev/video1
复制代码
查看当前摄像头支持的视频压缩格式
- v4l2-ctl -d /dev/video1 --list-formats
复制代码
- 查看摄像头所有参数
- v4l2-ctl -d /dev/video1 --all
复制代码
基于v4l2进行图像采集测试程序设计如下:v4l2.h文件
- #define NB_BUFFER 16
- #define DHT_SIZE 420
- struct vdIn {
- int fd;
- char *videodevice;
- char *status;
- char *pictName;
- struct v4l2_capability cap;
- struct v4l2_format fmt;
- struct v4l2_buffer buf;
- struct v4l2_requestbuffers rb;
- void *mem[NB_BUFFER];
- unsigned char *tmpbuffer;
- unsigned char *framebuffer;
- int isstreaming;
- int grabmethod;
- int width;
- int height;
- int formatin;
- int framesizeIn;
- int byteUsed;//add by dql
- };
- int init_videoIn (struct vdIn *vd, char *device, int width, int height);
- int uvcGrab (struct vdIn *vd);
- int close_v4l2 (struct vdIn *vd);
复制代码
vl2c.c文件
- #define NB_BUFFER 16
- #define DHT_SIZE 420
- struct vdIn {
- int fd;
- char *videodevice;
- char *status;
- char *pictName;
- struct v4l2_capability cap;
- struct v4l2_format fmt;
- struct v4l2_buffer buf;
- struct v4l2_requestbuffers rb;
- void *mem[NB_BUFFER];
- unsigned char *tmpbuffer;
- unsigned char *framebuffer;
- int isstreaming;
- int grabmethod;
- int width;
- int height;
- int formatIn;
- int framesizeIn;
- int byteUsed;//add by dql
- };
- int init_videoIn (struct vdIn *vd, char *device, int width, int height);
- int uvcGrab (struct vdIn *vd);
- int close_v4l2 (struct vdIn *vd);
复制代码
测试代码
- #include
- #include
- #include
- #include
- #include
- #include "v4l2uvc.h"
- void sigcatch(int sig)
- {
- fprintf(stderr, "Exiting...\n");
- }
- // usage: uvccapture /dev/video0 1920 1080 22.jpg
- int main(int argc, char *argv[])
- {
- char *videodevice = "/dev/video0";
- int width = 1920;
- int height = 1080;
- char *outputfile="9876543210.jpg";
- (void) signal(SIGINT, sigcatch);
- (void) signal(SIGQUIT, sigcatch);
- (void) signal(SIGKILL, sigcatch);
- (void) signal(SIGTERM, sigcatch);
- (void) signal(SIGABRT, sigcatch);
- (void) signal(SIGTRAP, sigcatch);
- videodevice = argv[1];
- width = atoi (argv[2]);
- height = atoi (argv[3]);
- outputfile = argv[4];
- struct vdIn *videoIn = (struct vdIn *) calloc(1, sizeof(struct vdIn));
- if (init_videoIn(videoIn, (char *) videodevice, width, height) < 0)
- {
- exit(1);
- }
- int cnt = 10;//第一帧曝光不足,比较黑
- while(cnt--)
- {
- if (uvcGrab(videoIn) < 0)
- {
- fprintf(stderr, "Error grabbing\n");
- close_v4l2(videoIn);
- free(videoIn);
- exit(1);
- }
- FILE *file = fopen(outputfile, "wb");
- if (file != NULL)
- {
- //fprintf(stderr, "Saving image to jpeg \"%s\",byteUsed=%d\n", outputfile,videoIn->byteUsed);
- fwrite(videoIn->tmpbuffer, videoIn->byteUsed + DHT_SIZE, 1, file);
- }
- fclose(file);
- }
- close_v4l2(videoIn);
- free(videoIn);
- return 0;
- }
复制代码
后续可以利用采集图像进行图像识别方面的研究了
0
|
|
|
|