[ARM入门]

技术干货 | i.MX 8视频开发案例全集

[复制链接]
3040|0
手机看帖
扫描二维码
随时随地手机跟帖
Tronlong创龙|  楼主 | 2021-7-30 09:44 | 显示全部楼层 |阅读模式

前言:

本文主要介绍基于NXP i.MX 8M Mini处理器的视频开发案例,主要包含:

(1) 基于GStreamer的USB摄像头视频采集、软件解码、边缘检测、显示案例。

(2) 基于GStreamer的网络摄像头视频采集、H.264解码、显示案例。

(3) 基于GigE工业相机的图像采集、显示、保存案例。

(4) 基于MIPI Camera OV4689摄像头演示Linux子系统V4L2的使用案例。

(5) H.265视频硬件解码功能演示。

案例测试硬件平台

TLIMX8-EVM评估板(NXP i.MX 8M Mini)


get?code=MGU1ZmE4ZmUzZDM4NmMyN2I3ZTVlYTU1ZWUwMTA4YWMsMTYyNzYwOTE3MjI4NQ==.jpg

图 1 TLIMX8-EVM评估板
1 USB摄像头案例
1.1 案例说明

本案例使用GStreamer API通过ARM Cotrex-A53从USB摄像头获取MJPEG格式视频流并进行软件解码,然后使用OpenCV对图像进行Sobel(边缘检测)算法处理,再将经过处理的图像在显示屏中实时显示。

程序工作流程框图如下所示:

get?code=NmNmMGU4YjIzMGFhYjQyYjhmZWU0ODExM2IzMDkyOTMsMTYyNzYwOTE3MjI4NQ==.jpg

图 2
1.2 案例测试
请按照下图进行硬件连接,将USB CMOS摄像头(厂家:锐尔威视,型号:RER-USB4KHDR01-V100)连接至评估板USB2 HOST接口,将HDMI显示屏连接至评估板HDMI OUT接口。
get?code=ODcwMjFiNTdhNTIyZjI0YjYxYWFmMDRiODdiNTRhZTUsMTYyNzYwOTE3MjI4NQ==.jpg

图 3

将案例bin目录下的gst_mjpeg_dec_cv_edge文件拷贝至评估板文件系统中。评估板上电并进入文件系统后,可执行如下命令查询摄像头的帧率、分辨率、设备节点等参数。
Target# gst-device-monitor-1.0
get?code=NDQyYTgzMGRhYmFlZWQyNGM5NTE2Yzc5N2M1YTMzMTIsMTYyNzYwOTE3MjI4NQ==.jpg

图 4
在gst_mjpeg_dec_cv_edge文件所在路径下,执行如下命令查询程序参数说明,具体如下表。
Target# ./gst_mjpeg_dec_cv_edge --help
get?code=MTFhOWViMjQ3Y2JkMTEyM2EwMDI2ODgzYzg1ZmM5MzAsMTYyNzYwOTE3MjI4NQ==.jpg

图 5
执行如下命令采集"/dev/video1"设备节点的视频流,视频流将在Cortex-A53中进行Sobel算法处理,再将经过处理的图像在显示屏中实时显示。
Target# systemctl start weston@root.service //打开Weston界面
Target# ./gst_mjpeg_dec_cv_edge -d /dev/video1 -w 1920 -h 1080 -f 30
get?code=YzIyYThlNTU5YzNhOTU5MDMxOTllZGU0N2ZkNjM2MWEsMTYyNzYwOTE3MjI4Ng==.jpg

图 6
表 1
get?code=YmVkYjcwOTAyNWY3YTBjNzdkZDZiZDE4NTY4OTZjYzAsMTYyNzYwOTE3MjI4Ng==.jpg

从打印结果可看到图像处理平均耗时约为50.65ms,图像采集帧率为25fps,图像处理帧率为13fps。

备注:
(1) 本案例使用的摄像头在拍摄静态物品时,帧率会有所降低。
(2) 图像边缘处理平均时间,指调用OpenCV Sobel算法进行边缘检测的耗时。
(3) 计算图像边缘处理帧率时使用的总时间,包含从Gstreamer队列获取数据进行边缘检测、传输数据到Gstreamer队列的所有耗时。
本案例使用Sobel算法处理效果图如下所示。
get?code=ZTBiYjhiY2Y5NTA3ZGE1YjdmYzA3NDc1ZjZmZjI0MTcsMTYyNzYwOTE3MjI4Ng==.jpg

图 7
本案例使用Cortex-A53进行图像采集、软件解码和算法处理,本次测试CPU占用率为131.2%,如下图所示。
备注:i.MX 8M Mini有4个Cortex-A53核心,CPU占用率最高可达400%。
get?code=MzBjY2Y3MjI0MjUzMGQyMGZjMDIwM2EzMTVkMWM5N2EsMTYyNzYwOTE3MjI4Ng==.jpg

图 8
2 网络摄像头案例
2.1案例说明

本案例使用GStreamer API通过Cotrex-A53从网络摄像头获取H.264格式视频流数据,然后通过VPU进行H.264视频硬件解码,再将解码的图像在显示屏中实时显示。

程序工作流程框图如下所示:

get?code=NTA3NWYyZTRmNmZjOGY3MmYxZTU4NGZmYzQ3OTEzNDgsMTYyNzYwOTE3MjI4Ng==.jpg

图 9
2.2案例测试
get?code=ODM4MTI2MmYyMmVhYjFhNDYzNTQ0Yzk2NGM4NThmNzIsMTYyNzYwOTE3MjI4Ng==.jpg

图 10
请按照上图进行硬件连接,并将该案例bin目录下的gst_rtsp_dec_display可执行文件拷贝至评估板文件系统中。在gst_rtsp_dec_display文件所在路径下,执行如下命令查询程序参数说明,具体如下表。
Target# ./gst_rtsp_dec_display --help
get?code=YjkyMjJmYTNjYmExMjNmOWZiYTQwYzE0MjgxYTg3ZGQsMTYyNzYwOTE3MjI4Ng==.jpg

图 11
本案例使用的网络摄像头IP地址为192.168.0.178,请确保评估板和网络摄像头IP地址处于同一网段。
get?code=OTAwYmZmNDM5MTI0YzNjMDNlZGQ0MWM3YjdkYTdiNjgsMTYyNzYwOTE3MjI4Ng==.jpg

图 12
执行如下命令采集视频流数据,并将解码后的视频流数据在显示屏中实时显示。
Target# systemctl start weston@root.service //开启Weston
Target# ./gst_rtsp_dec_display -u rtsp://admin:tl123456@192.168.0.178:554/h264/ch1/main/av_stream -w 1920 -h 1080 -f 25 -s 1 //192.168.0.178为摄像头IP地址

get?code=NmQwNjNiOWY5MTU1YjgwYzA3NDRjOWM5NTY5NDc2ZTgsMTYyNzYwOTE3MjI4Ng==.jpg

图 13
get?code=MzFiMjU3ZWIxNzAyYjJiNzI0ZTc1YTlkMGIxNWZmODUsMTYyNzYwOTE3MjI4Ng==.jpg

图 14
本次测试CPU占用率为63.7%,如下图所示。
备注:i.MX 8M Mini有4个Cortex-A53核心,CPU占用率最高可达400%。

get?code=NTZiNDVjMzYwNDE3YjZkOTFlOWY2ZGM5NWU0MDI1NTcsMTYyNzYwOTE3MjI4Ng==.jpg

图 15
2.3时延测试

时延测试方法:使用摄像头采集PC机显示屏的在线秒表图像。PC机显示画面与评估板显示画面的时间差,即为时延。进行多次测试,时延结果取其平均值。


表 2
get?code=Zjc4Zjg1NTIyZGY3MmFlNDQ1ZTU0OWQzNGRkM2Q4ZDYsMTYyNzYwOTE3MjI4Ng==.jpg


3 GigE工业相机案例

本案例通过评估板千兆网口接入GigE工业相机实现图像采集、图像显示和图像保存的功能。相机型号:acA720-290gm,品牌:Basler,分辨率可配置最大为720x542,帧率可达291fps。
本案例实测达到的帧率为:采集并显示为720x540@138fps,采集并保存为720x540@31fps。
测试案例gige_capture位于产品资料“4-软件资料\Demo\base-demos\”路径下。为方便测试,产品资料中提供了经过验证的测试程序可执行文件,位于gige_capture的bin目录下,源码位于gige_capture的src目录下。


3.1GigE网络相机配置
本小节使用Basler官方提供的pylonSDK开发包,在PC机Ubuntu中对GigE工业相机进行IP地址获取方式、采集帧率等参数配置。
具体配置步骤可下载详细资料查看。


3.2图像采集测试
通过网线将评估板RGMII接口和GigE工业相机连接至相同路由器,评估板默认支持HDMI显示,请先正确连接HDMI显示屏。
备注:如GigE工业相机配置为静态IP,则需通过网线将评估板和GigE工业相机直连,并设置评估板和GigE工业相机为同一网段。

get?code=ZmJkOGE5M2NmNTk0ZTZhNWU0OTA4ZmNkY2Y3YzUzYmMsMTYyNzYwOTE3MjI4Ng==.jpg

图 16

将“gige_capture\lib\”目录下的库文件压缩包libpylon_arm64.tar.gz拷贝至评估板文件系统任意目录,并进入压缩包所在目录执行如下命令将其解压至“/usr/lib/”目录。
Target# tar -xvf libpylon_arm64.tar.gz -C /usr/lib

get?code=MzQ4ZmUzOGFkOTBhNTc3MGE2OWYwM2Y4YmRiZjU4NWIsMTYyNzYwOTE3MjI4Ng==.jpg

图 17
GigE工业相机上电,进入评估板文件系统,请将bin目录下的可执行文件gige_capture拷贝至评估板文件系统任意路径下。在gige_capture可执行文件所在目录下执行如下命令查看程序参数说明。
Target# ./gige_capture --help

get?code=NTRlOWE5NTg4NTBiZGY2NzI2ZGY5YmY1NGE0MDhhNTksMTYyNzYwOTE3MjI4Nw==.jpg

图 18

执行如下命令扫描局域网内的GigE工业相机,并测试GigE工业相机图像采集帧率。
Target# ./gige_capture -m scan

get?code=NmU5ZGI0NzI5MTYzYTkwZDBlZjQ5MWFjZDI4NGE1ZDcsMTYyNzYwOTE3MjI4Nw==.jpg

图 19

并执行如下命令关闭Weston界面,将GigE工业相机采集的图像显示到显示屏上。若图像显示不清晰,请旋转旋钮调节相机镜头光圈和焦距,GigE工业相机会以设置的分辨率720x540进行实时采集,本次实测采集并显示的处理帧率为138fps,进行采集并显示的帧率会受硬件性能和网络环境的影响有一定的波动。
Target# systemctl stop weston@root.service
Target# ./gige_capture -m display -o /dev/fb

get?code=Y2E1MDA1MzdlMmNiMmRmMjFiZjRiMTUxYzE5NTUxNzIsMTYyNzYwOTE3MjI4Nw==.jpg

图 20
get?code=N2Q5ZDU5YTBlNWIzMDQwZWU1MTZjNTc3OTE0YTNjYzMsMTYyNzYwOTE3MjI4Nw==.jpg

图 21

本次测试的CPU占用率如下所示。

get?code=MDFkYTQ2OTMxOTM5Zjg4YmNmNjUzMzhhMmRjNWY0ZGIsMTYyNzYwOTE3MjI4Nw==.jpg

图 22

执行如下命令,将GigE工业相机采集的图像以gray8的格式保存至指定路径的文件中。采集并存储的帧数会受设备的读写速率影响,本次实测为31fps。
Target# ./gige_capture -m save -o /home/root/test.gray8

get?code=MmU4MTMzN2EyZDc2ZWJmNDIwMDIyYTEyZjJmMDU4MmMsMTYyNzYwOTE3MjI4Nw==.jpg

图 23

将保存的文件复制到Windows下,使用“gige_capture\tools\yuvplayer.exe”程序打开test.gray8文件,点击“Size -> Custom”,设置图像格式Width为720,Height为540,点击“Color -> Y”,点击播放按钮即可显示图像,如下所示。
get?code=MzJlMzI2ZDZhNDJkZDdmMTJmMmJjNmYxYTc5NjVkODgsMTYyNzYwOTE3MjI4Nw==.jpg

图 24
get?code=MjE2NmUxODQwYzk5NDRhOGQ2OTkwYzEyMzFmOTE2NmIsMTYyNzYwOTE3MjI4Nw==.jpg

图 25
get?code=ZGY4NDM5NzYyMzlhNWVjZmZjYTE5MDE1NjA0YzFlYjgsMTYyNzYwOTE3MjI4Nw==.jpg

图 26
4 MIPI摄像头案例
4.1案例功能

本案例基于MIPI Camera OV4689摄像头演示Linux子系统V4L2的使用,支持YUYV、RGGB、RGB565格式转换为RGB格式。

案例支持list、save、display三种功能模式,通过命令行参数传入主程序进行设置。功能模式简要说明如下:

(1) list:查询摄像头设备,并打印设备相关信息,比如分辨率、帧率、格式等。
(2) save:采集摄像头的图像数据,保存到指定文件,格式为YUYV。
(3) display:采集摄像头图像数据,写入到framebuffer以实现
图像显示,格式为YUYV。

程序工作流程框图如下所示:

get?code=ZGE3NmFjM2RhMjllNThkNmJiMzg3OTYxNDMxOTdmNzAsMTYyNzYwOTE3MjI4Nw==.jpg

图 27
get?code=YWZiMDIzZDljN2QxOTk2YTViMzFhMDAxYmQ1MmZhMDIsMTYyNzYwOTE3MjI4Nw==.jpg

图 28
4.2 案例测试
请使用FPC软排线将MIPI Camera OV4689摄像头模块(型号:MCAM400)连接至评估板MIPI CAMERA接口。

get?code=OTVmM2U0N2Y2Njg2NmQzMWVlZmEyMDc0ODE3NjhhZjgsMTYyNzYwOTE3MjI4Nw==.jpg

图 29

将本案例bin目录下的可执行程序v4l2_capture复制到评估板文件系统,并进入可执行程序所在目录,执行如下命令查看程序参数信息。
Target# ./v4l2_capture --help

get?code=NDRiOTZmYThlYzQwZTgwOGZkMTUzYjViNWY2NGRlODgsMTYyNzYwOTE3MjI4Nw==.jpg

图 30

参数解析:
-m:指定运行模式。
-d:指定目标设备。
-t:设备接入接口选择,支持usb(默认)、vpif、csi。
-F:指定采集格式,支持YUYV、RGB565、RGGB、BGGR。
-w:指定采集帧宽。
-h:指定采集帧高。
-f:指定采集帧率,若摄像头不支持帧率设置,则设为0。
-o:指定输出目标,save模式下为文件路径,display模式下为fb设备节点。
-n:save模式下使用,为保存帧数。
-v:版本信息。
--help:帮助信息。
a) 保存测试彩条图像

为验证评估板MIPI CAMERA接口通路是否正常,将配置摄像头产生一帧彩条图像,进行采集和保存。

请执行如下命令加载驱动。

Target# insmod ov4689.ko test_pattern_enable=1
get?code=ZTFhNjQ3YmYwZTk4YzNmNGIwZDcxZjMxM2IxYjUwNjYsMTYyNzYwOTE3MjI4Nw==.jpg

图 31

执行如下命令查询V4L2设备相关参数信息,"/dev/video0"为V4L2设备节点。
备注:MIPI Camera OV4689摄像头不支持设置帧率,默认仅支持1920*1080分辨率,帧率为60fps。
Target# ./v4l2_capture -m list -d /dev/video0

get?code=ZjJiYzY1ZTQ0N2FhOWJhYTRlZjYzYTJjOThjZWExNDUsMTYyNzYwOTE3MjI4Nw==.jpg

图 32


执行如下命令保存一帧测试图像数据至指定文件中。"-m save"指定为save模式,"-w 1920 -h 1080"指定以1920*1080分辨率进行图像采集,"-F BGGR"指定采集格式,"-o /home/root/test.raw"指定文件保存路径,"-n 1"指定采集1帧图像。

Target# ./v4l2_capture -m save -d /dev/video0 -w 1920 -h 1080 -F BGGR -o ./test.raw -n 1

get?code=MTZhZmVhMTY2ODg0NmMxNjYxN2E0MGNiNjQ2ODk0NjcsMTYyNzYwOTE3MjI4Nw==.jpg

图 33

将生成的test.raw文件拷贝至bayer2rgb工具目录下,执行如下命令将图像数据转换为RGB格式,并保存在当前目录下的test.tiff文件中。
Host# ./bayer2rgb -i ./test.raw -o ./test.tiff -w 1920 -v 1080 -b 8 -f BGGR -t


get?code=NTcwODEyOTQ5Y2U4NWQ1MzBkNzEwMGZkMWQyMjAwN2IsMTYyNzYwOTE3MjI4Nw==.jpg

图 34

在图形操作界面双击test.tiff文件进行图像查看。

get?code=N2ZkMDM4ZjczZTRhNjkxZGEyMjg2NzEzN2VmNzZkMDIsMTYyNzYwOTE3MjI4Nw==.jpg

图 35
get?code=NzllMDFiOTg0NDVlN2Q4NDNkNjQ5NTllYjA3Nzk4ZjIsMTYyNzYwOTE3MjI4Nw==.jpg

图 36

b) 保存实际采集图像
重启评估板,执行如下命令加载驱动。
Target# insmod ov4689.ko


get?code=MzdkYTVjOGE2YzkxYjI1NjMwMDA3Yzk5ZTZjZTc4MmIsMTYyNzYwOTE3MjI4Nw==.jpg

图 37

执行如下命令保存一帧摄像头采集的图像数据至指定文件中。"-m save"指定为save模式,"-w 1920 -h 1080"指定以1920*1080分辨率进行图像采集,"-F BGGR"指定采集格式,"-o /home/root/test.raw"指定文件保存路径,"-n 1"指定采集1帧图像。

Target# ./v4l2_capture -m save -d /dev/video0 -w 1920 -h 1080 -F BGGR -o ./test.raw -n 1

get?code=NjgzN2U4NWY2MGVhZWI2Zjk4YmRjMmQxZjM0ZGViZWEsMTYyNzYwOTE3MjI4Nw==.jpg

图 38

将生成的test.raw文件拷贝至bayer2rgb工具目录下,执行如下命令将图像数据转换为RGB格式,并保存在当前目录下的test.tiff文件中。

Host# ./bayer2rgb -i ./test.raw -o ./test.tiff -w 1920 -v 1080 -b 8 -f BGGR -t


get?code=MmI2MmM0NGYzMDYyODZjYmVmYjlkNTQ1ZTIwYzA1NGUsMTYyNzYwOTE3MjI4OQ==.jpg

图 39

在图形操作界面双击test.tiff文件进行图像查看。
备注:摄像头的曝光增益等参数未进行优化,同时摄像头传输的数据为原始数据,转换工具仅进行简单的颜色转换,并未做ISP处理。


get?code=MDc5MWFiMmFmYWEwYzRjYTEwMjUwNGU5MmViMmIyZjgsMTYyNzYwOTE3MjI4OQ==.jpg

图 40
get?code=MjUwYzNmM2E0MDYwMTc0MDhlZjc2MmI1NjliNDhjZTksMTYyNzYwOTE3MjI4OQ==.jpg

图 41


5 H.265视频硬件解码案例

由于本章节测试步骤较长,因此不在本文进行描述。如需了解详细测试步骤,请留言资料查阅。



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

226

帖子

4

粉丝