通过v4l2读取摄像头图片

这篇博客介绍了如何在树莓派上通过v4l2库读取摄像头图片,利用libjpeg存储RGB图像,并借助libudev自动查找视频设备。在设置图像格式时,需要注意检查VIDIOC_S_FMT和VIDIOC_G_FMT的设置是否成功,以避免因图片格式过大或其他不支持的问题导致的错误。

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

之前网络上找到的v4l2读取图片的代码基本可以用,但是代码冗余,这个代码在树莓派上测试通过,其它系统上未测试
代码中使用的库:
libjpeg实现rgb图像存储成图片
libudev实现了自动查找视频设备的功能
说明:
VIDIOC_S_FMT设置要读取的格式后要用VIDIOC_G_FMT再获取下,查检是否设置成功了,比如设置的图片太大,fmt.fmt.pix.pixelformat不支持等问题

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <linux/types.h>
#include <linux/videodev2.h>
#include <setjmp.h>
#include <libudev.h>
#include <stdint.h>
#include "jpeglib.h"



#define JPEG_QUALITY 100

#define  IMAGEWIDTH 352
#define  IMAGEHEIGHT 288

static char dev_path[128];
static int fd;
static struct v4l2_capability cap;
struct v4l2_fmtdesc fmtdesc;
struct v4l2_format fmt, fmtack;
struct v4l2_requestbuffers req;
struct v4l2_buffer buf;
enum v4l2_buf_type type;
unsigned char frame_buffer[IMAGEWIDTH * IMAGEHEIGHT * 3];

struct buffer {
    void *start;
    unsigned int length;
} *buffers;



int device_find()
{
    struct udev *udev;
    struct udev_enumerate *enumerate;
    struct udev_list_entry *devices, *dev_list_entry;
    struct udev_device *dev;

    udev = udev_new();
    if (!udev) {
        printf("Can't create udev\n");
        return -1;
    }

    enumerate = udev_enumerate_new(udev);
    udev_enumerate_add_match_subsystem(enumerate, "video4linux");
    udev_enumerate_scan_devices(enumerate);
    devices = udev_enumerate_get_list_entry(enumerate);

    udev_list_entry_foreach(dev_list_entry, devices) {
        const char *path;
        path = udev_list_entry_get_name(dev_list_entry);
        dev = udev_device_new_from_syspath(udev, path);
        sprintf(dev_path, "%s",  udev_device_get_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值