视频传输参考链接:https://github.com/MaimonLab/video_io
图像传输是将一张图片发送到topic上,需要的节点会从这个topic上订阅并接收图片,视频传输与图像传输相似,只是视频传输是将视频帧一帧一帧的依次发送到topic上,图像传输发送的只是同一张图片。
include文件夹中是一些头文件,定义了可执行c++文件的一些参数;videos文件夹中是要传输的视频,videos_saved文件夹下是保存的视频;src文件夹中包含了c++运行程序,其中video_publisher.cpp用于创建发布节点并将视频分帧传输到topic上,video_saver.cpp用于创建订阅节点并从topic上下载视频帧并保存。具体代码解释如下:
1. video_publisher.cpp
首先是一些依赖库的导入,其中sensor_msgs用来定义ros中的图像数据格式,是image类型;image_transport发布和订阅图像的传输;cv_bridge用来进行image的cv数据格式和ROS数据格式之间的转换。
然后是图像发布节点的功能定义,指定了所要传输的视频地址,运行代码需要注意更改此处地址,终端处于哪一文件夹下,此地址为当前文件夹下的相对地址,例如文件的绝对路径为~/HMT_ws/src/video_transport/video/rocket.mp4,根据当前代码指定的这个路径,需要终端处于~/目录下运行。其次视频传输需要设置起始帧为0。如果视频的地址设置存在错误,会报出找不到视频文件的错误。
接下来是一些参数的定义,包括视频流的总帧数,视频帧的宽度和高度,视频的帧率,视频帧的发布频率定位30帧/秒,以此频率传输所需时间,然后将获取到的这些参数打印到终端上。
然后是帧的发布,定义topic是’camera/image’,设置了质量传输协议QoS,然后定义了一个时间触发器,规定每隔多长时间触发一次publish操作。
最后是publish函数,如果当前帧等于视频流的总帧数,就关闭节点不再发布;将读取到的cv格式的视频帧转换为ros可传输的image消息格式并发布到节点上去。
2. video_saver.cpp
开始依然是一些依赖包的导入,并提供了一些可用图像编码转换的格式。
然后是一些参数的定义,指定订阅topic为与发布者相同的’camera/image’,视频接收的频率与视频传输的频率一样,都是30帧/秒,指定视频的编码格式为mjpg,是一种压缩图像格式,然后指定了保存视频的相对路径,此处的路径与发布者的路径注意项一致,都是相对路径。然后下面定义了一些图像编码的格式转换选择,根据选择,输出视频的保存格式都为avi格式。
然后也定义了质量传输策略QoS,逐帧保存视频时要打开视频的保存路径,然后接收到的视频帧从ROS的image格式再转换为cv格式并写入。
最后,进行视频传输。
#Terminal 1
ros2 run video_transport video_saver
#Terminal 2
ros2 run video_transport video_publisher
结果如下,videos_saved文件夹下增加了保存的视频流文件。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!