Toybrick

rv1126 想使用c++底层实现v4l2抓图,摄像头capability测试

hxx1227

注册会员

积分
67
楼主
发表于 2023-7-22 10:48:40    查看: 10951|回复: 11 | [复制链接]    打印 | 只看该作者
按照帖子里说的v4l2命令行抓图可以抓图成功,但偶尔有几张图抓出来是黑的
现在想用cpp实现抓图命令获取图像帧
首先通过测试程序来配套的摄像头的能力,发现并不且具有捕获视频的能力(V4L2_CAP_VIDEO_CAPTURE),只具有流式传输(V4L2_CAP_STREAMING)结果如下
root@debian10:/home/toybrick/plate_detect_reg# ./cap /dev/video19
camera device:/dev/video19
driver: rkispp_v0
card:   rkispp_scale0
bus_info:       platform:rkispp-vir0
version:        267180
capability:     84201000
The device /dev/video19 does not support V4L2_CAP_VIDEO_OUTPUT command.
the device /dev/video19 is not support V4L2_CAP_READWRITE
the device /dev/video19 is not support capture
the device /dev/video19 is support streaming
device_caps:    4201000


这样的话是不是无法获取图像帧,或者用stream也可以获得?
然后我按照教程尝试去写,当碰到这个接口ioctl的时候总是会报错(Error querying buffer),也不知道是不是我配置的问题?感谢!



回复

使用道具 举报

hxx1227

注册会员

积分
67
沙发
 楼主| 发表于 2023-7-22 10:52:26 | 只看该作者
用的是TB-RV1126ds开发板配套的摄像头,为什么测试出来会不具体视频捕获能力?有大佬知道吗?救救救!
回复

使用道具 举报

jefferyzhang

版主

积分
13574
板凳
发表于 2023-7-22 13:11:14 | 只看该作者
你怎么确认是 /dev/video19
回复

使用道具 举报

hxx1227

注册会员

积分
67
地板
 楼主| 发表于 2023-7-22 14:19:05 | 只看该作者
jefferyzhang 发表于 2023-7-22 13:11
你怎么确认是 /dev/video19

v4l2-ctl -d /dev/video19 --set-selection=target=crop,width=1920,height=1080 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap=3 --stream-to=mp.out --stream-count=1 --stream-poll
这个抓图命令可以抓到
回复

使用道具 举报

hxx1227

注册会员

积分
67
5#
 楼主| 发表于 2023-7-22 14:22:09 | 只看该作者
jefferyzhang 发表于 2023-7-22 13:11
你怎么确认是 /dev/video19

要怎么确认呀?大佬
回复

使用道具 举报

jefferyzhang

版主

积分
13574
6#
发表于 2023-7-22 21:32:25 | 只看该作者
media-ctl -p /dev/media0 和 1 和 2 分别看下就知道了
回复

使用道具 举报

hxx1227

注册会员

积分
67
7#
 楼主| 发表于 2023-7-22 22:21:45 | 只看该作者
jefferyzhang 发表于 2023-7-22 21:32
media-ctl -p /dev/media0 和 1 和 2 分别看下就知道了

我把所有的/dev/video设备都试过了呢,都不具备视频捕获能力V4L2_CAP_VIDEO_CAPTURE ,要怎么解决呢
回复

使用道具 举报

jefferyzhang

版主

积分
13574
8#
发表于 2023-7-24 09:44:12 | 只看该作者
如果你确认过media框架输出是那个video节点,那就只是驱动没加capture标志位而已,直接去拿就行,没区别
回复

使用道具 举报

hxx1227

注册会员

积分
67
9#
 楼主| 发表于 2023-7-24 11:12:58 | 只看该作者
jefferyzhang 发表于 2023-7-24 09:44
如果你确认过media框架输出是那个video节点,那就只是驱动没加capture标志位而已,直接去拿就行,没区别 ...

是不是这样理解,我就直接按正常流程去设置,比如这样设置格式啥的
struct v4l2_format fmt;
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    fmt.fmt.pix.width = WIDTH;
    fmt.fmt.pix.height = HEIGHT;
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
    if(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt)){//设置图片格式
        perror("set format failed!");
        return -1;
    }
    if(-1 == ioctl(fd, VIDIOC_G_FMT, &fmt)){//得到图片格式
        perror("set format failed!");
        return -1;
    }
然后这里if条件我就去掉,不让它去判断,直接就ioctl这些设置走一遍就可以吧?

   
回复

使用道具 举报

jefferyzhang

版主

积分
13574
10#
发表于 2023-7-24 11:27:00 | 只看该作者
v4l2-ctl是开源的,只要你用v4l2-ctl能拉到图,按他代码写就没问题
回复

使用道具 举报

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

本版积分规则

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


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