Toybrick

3588 使用V4L2编程 VIDIOC_QUERYBUF查询失败,返回-1

gxl1028

注册会员

积分
129
发表于 2023-7-27 15:56:34    查看: 2901|回复: 6 | [复制链接]    打印 | 显示全部楼层
使用V4L2代码如下:
/* 第四步:让摄像头驱动申请存放图像数据的缓冲区 */
    struct v4l2_requestbuffers reqbuf;
    reqbuf.count = COUNT;                       // 缓冲区个数
    reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;  // 缓冲区类型
    reqbuf.memory = V4L2_MEMORY_MMAP;           // 缓冲区的用途:用于内存映射
    ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
    if (-1 == ret)
    {
        perror("ioctl VIDIOC_REQBUFS");
        close(fd);
        return -4;
    }
    printf("qrequbuf.count is %d\n", reqbuf.count);

    /* 第五步:查询每个缓冲区的信息,同时进行内存映射 */
    for (i = 0; i < COUNT; i++)
    {
        struct v4l2_buffer buff;
        buff.type = reqbuf.type;
        buff.memory = reqbuf.memory;
        buff.index = i;
        ret = ioctl(fd, VIDIOC_QUERYBUF, &buff);
        if (-1 == ret)                          // 操作失败
        {
            printf("querybuf falied\n");
            break;
        }

        /* 打印缓冲区的长度和偏移量 */
        printf("buf[%d]: len = %d offset: %d\n", i, buff.length, buff.m.offset);

查询每个缓冲区时,ioctl(fd, VIDIOC_QUERYBUF, &buff)返回-1。其中COUNT= 5.


回复

使用道具 举报

jefferyzhang

版主

积分
13210
发表于 2023-7-27 16:25:10 | 显示全部楼层
先用v4l2-ctl拉下图,能拉到就参考人家开源代码写
回复

使用道具 举报

gxl1028

注册会员

积分
129
 楼主| 发表于 2023-7-28 14:21:21 | 显示全部楼层
jefferyzhang 发表于 2023-7-27 16:25
先用v4l2-ctl拉下图,能拉到就参考人家开源代码写

嗯嗯,现在能顺利获取图片了。但是YUYV格式转RGB转出来的色彩存在偏差,我目前用opencv里面的cvtColor函数做转换,图像会出现局部偏红或者偏蓝的问题,请问这个问题有什么解决办法吗?
回复

使用道具 举报

xiaoci

新手上路

积分
12
发表于 2024-4-2 18:35:07 | 显示全部楼层
gxl1028 发表于 2023-7-28 14:21
嗯嗯,现在能顺利获取图片了。但是YUYV格式转RGB转出来的色彩存在偏差,我目前用opencv里面的cvtColor函 ...

我和你一样,请求失败,老哥是怎么解决的?
回复

使用道具 举报

xiaoci

新手上路

积分
12
发表于 2024-4-2 18:36:03 | 显示全部楼层
jefferyzhang 发表于 2023-7-27 16:25
先用v4l2-ctl拉下图,能拉到就参考人家开源代码写

可以拉取,我代码和楼主一样。我v4l2ctl可以拉图但是c++库却不行
回复

使用道具 举报

jefferyzhang

版主

积分
13210
发表于 2024-4-3 16:05:08 | 显示全部楼层
xiaoci 发表于 2024-4-2 18:36
可以拉取,我代码和楼主一样。我v4l2ctl可以拉图但是c++库却不行

v4l2ctl 就是一个开源的程序 v4l2-utils,
既然命令能用,抄他代码肯定就能用。。
回复

使用道具 举报

gxl1028

注册会员

积分
129
 楼主| 发表于 2024-4-9 10:56:54 | 显示全部楼层
xiaoci 发表于 2024-4-2 18:36
可以拉取,我代码和楼主一样。我v4l2ctl可以拉图但是c++库却不行

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE的代码不能这么写,你在网上查一下,这个代码没办法获取图像
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表