Toybrick

V4L2+RGA+Opencv demo 出错

shopping

中级会员

积分
410
楼主
发表于 2019-10-8 12:17:26    查看: 7526|回复: 5 | [复制链接]    打印 | 只看该作者
本帖最后由 shopping 于 2019-10-11 14:59 编辑

如标题,用V4L2获取视频码流,然后用RGA将其由YUV422格式转换为BGR格式,最后opencv显示时满屏幕只有绿色,没有任何画面。一开始代码质量不高,导致报错,后来翻新了代码之后也报了一些错,具体见下面吧,此处不赘叙了。再说说RGA ,由于我的摄像头输出格式是 YUV422 和 MJPEG 两种,遗憾的是两者RGA都不支持,所以只能自定义转换格式函数,具体见代码。
V4L2参考:https://blog.csdn.net/tangshopping/article/details/101679381


附上 github 地址 : https://github.com/shopping-tang/New_v4l2/tree/master 。有需要的朋友可以看一下,抛砖引玉,欢迎大神来锤。

程序运行与编译无报错,就是显示时如图,一片绿.(BUG已解决)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

shopping

中级会员

积分
410
沙发
 楼主| 发表于 2019-10-10 16:51:28 | 只看该作者
本帖最后由 shopping 于 2019-10-11 08:45 编辑

找了一下,目前发现一个问题:L240的 memcpy((void*)srcBuffer , buffers[buf.index].start , buf.length) ,buf.length 与 buf.index 总是为 0.
把程序改了一下之后,发现这个问题不仅没消失。还出现新的问题,ioctl(fd, VIDIOC_DQBUF, &buf) 这里会阻塞,程序不能往下运行。

将 fd = open(FILE_VIDEO, O_RDWR) 改为 fd = open(FILE_VIDEO, O_RDWR | O_NONBLOCK) 阻塞模式改为非阻塞模式,程序虽然可以继续运行,但由于没有获取到视频就返回数据,使得结果显示为全屏绿。

总结一下:如果设为阻塞模式,程序由于不能正常DQBUF而被卡住,不能向前执行;
                如果设为非阻塞模式,程序没有获取到视频帧就返回缓存指针,所以buf.length 与 buf.index 总是为 0,使得显示不正常。


回复

使用道具 举报

shopping

中级会员

积分
410
板凳
 楼主| 发表于 2019-10-11 08:37:06 | 只看该作者
本帖最后由 shopping 于 2019-10-11 08:51 编辑

昨天找了很久的bug,最后看其他人的意思是,开个cheese看一下,看能否正常运行,如果不行说明V4L2卡程序可能是因为驱动的原因。因为一般来说,cheese能用说明驱动这方面不存在问题,这一下我在论坛里问的两个问题就合并了?
PS 本论坛里cheese问题的链接:http://t.rock-chips.com/forum.php?mod=viewthread&tid=925&extra=
回复

使用道具 举报

shopping

中级会员

积分
410
地板
 楼主| 发表于 2019-10-11 09:57:03 | 只看该作者
本帖最后由 shopping 于 2019-10-11 09:59 编辑

不知道什么鬼,重启一下所有的BUG就消失了,我佛了,足足写了10遍的V4L2+RGA代码,感觉落差好大,唉,谢谢楼上的老哥友情回复。
回复

使用道具 举报

shopping

中级会员

积分
410
5#
 楼主| 发表于 2019-10-11 11:06:44 | 只看该作者
新的问题,RGA转换格式出错,结果显示花屏重影。
回复

使用道具 举报

shopping

中级会员

积分
410
6#
 楼主| 发表于 2019-10-11 14:49:58 | 只看该作者
看文档不注意,原来RGA不支持 YUV422 BGR 格式,只能用函数转换格式了。
回复

使用道具 举报

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

本版积分规则

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


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