v4l2的小demo

本文档提供了一个简单的v4l2demo,用于从/dev/video0打开摄像头并获取yuv422格式的图像。程序展示了如何设置图像宽高、查询摄像头属性、处理帧率和保存帧数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
*名称:v4l2demo
*作者:zym
*时间:20180503
*说明:(1)本demo得到的是yuv422格式的图像
*   (2)对于图像,我们用宽和高来描述
*      (3)对于得到的yuv帧,使用7yuv等软件进行打开
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#include <linux/v4l2-mediabus.h>
#include<unistd.h>




#define BUFFER_COUNT 10              //缓存帧数目
typedef struct VideoBuffer {         //用来映射缓存帧
    void   *start;
    size_t  length;
} VideoBuffer;
int VIDEO_WIDTH = 1280;              //默认宽、高
int VIDEO_HEIGHT = 720;
int n;                               //定义得到的yuv帧的数量
int continunity;                     //yuv帧的连续与否
int Open_Camera(){                   //打开摄像头
    int ret=open("/dev/video0",O_RDWR);//打开方式:read和write,用一个int型来标记这个摄像头
    if(ret<0)
        printf("opoened error\n");
    else
        printf("connected success!  welcome!\n\n");
    return ret;
}
void Close_Camera(int camera){    //关闭摄像头
    close(camera);
    printf("Thinks for using,goodbye!\n");
}
void Show_Camera_Capability(int camera){//查询摄像头属性
    struct v4l2_capability cap;//套路:先定义一个特定的结构体,然后调用v4l2接口函数来将其填充,之后打印出来
    ioctl(camera, VIDIOC_QUERYCAP, &cap);
    printf("Capability Informations:\n");
    printf("driver: %s\n", cap.driver);// 驱动名字
    printf("card: %s\n", cap.card);// 设备名字
    printf("bus_info: %s\n", cap.bus_info);//设备在系统中的位置
    printf("version: %08X\n", cap.version);// 驱动版本号
    printf("capabilities: %08X\n\n", cap.capabilities);//设备支持的操作
}
void Show_Current_Format(int camera){//查询当前的帧的格式
    struct v4l2_format fmt;
    memset(&fmt,0,sizeof(fmt));
    fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl(camera, VIDIOC_G_FMT, &fmt);
    printf("Stream Format Informations:\n");
    printf("type: %d\n", fmt.type);
    printf("width: %d\n", fmt.fmt.pix.width);
    printf("height: %d\n", fmt.fmt.pix.height);
    char fmtstr[8];
    memset(fmtstr, 0, 8);
    memcpy(fmtstr, &fmt.fmt.pix.pixelformat, 4);
    printf("pixelformat: %s\n", fmtstr);
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值