参考方案之前在使用ubuntu16.04时发现ROS下的cv_bridge类仅支持python2,在做项目时又需要在python3中进行,尝试把这个坑填了一下,供大家借鉴。(当然现在貌似ubuntu20.04 ROS都支持python3了) 1. 创建工作空间mkdir cat…https://zhuanlan.zhihu.com/p/407517632网络上很多文章,都是写的noetic以下版本,安装cv_bridge插件,出现的种种问题,这是由于,ros在之前的版本对python3的支持不够好,noetic版本开始,加强了对于python3的支持。
废话不多说,直接开始
基础环境,ubuntu20.04,Ros(noetic,划重点),不知道怎么安装Ros,请参考鱼香Ros一键安装脚本
1. 创建工作空间
mkdir -p ~/testVision_OpenCV/src
cd testVision_OpenCV/src
2.编译代码并安装
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
#进入到clone的项目
cd vision_opencv
#切换到对应的分支,重要!!!
git checkout -b noetic remotes/origin/noetic
cd ~/testVision_OpenCV && catkin_make
开始执行编译,不出问题直接可以编译成功
3.虚拟环境调用(不用虚拟环境,可以忽略这一步)
virtualenv pyenv -p /usr/bin/python3
source pyenv/bin/activate
#虚拟环境内安装依赖,装完后,可以愉快的在虚拟环境中进行开发了
pip install catkin-tools
pip install rospkg
4.测试代码(读取video并发布)
# coding=utf-8
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
# import customCvBridge as CvBridge
import cv2
def video_publisher():
# 初始化ROS节点
rospy.init_node('video_publisher', anonymous=True)
# 创建图像发布者
image_pub = rospy.Publisher('rgb_topic', Image, queue_size=10)
# # 创建CvBridge对象
bridge = CvBridge()
# 打开视频文件
video = cv2.VideoCapture('./test.mp4')
# 检查视频是否成功打开
if not video.isOpened():
rospy.logerr('无法打开视频文件')
return
# 循环读取视频帧并发布
rate = rospy.Rate(30) # 设置发布频率为30帧/秒
while not rospy.is_shutdown():
ret, frame = video.read()
if ret:
# 将帧转换为ROS图像消息
image_msg = bridge.cv2_to_imgmsg(frame)
# 发布图像消息
image_pub.publish(image_msg)
else:
# 视频结束时退出循环
break
rate.sleep()
# 关闭视频文件
video.release()
if __name__ == '__main__':
try:
video_publisher()
except rospy.ROSInterruptException:
pass