ROS操作系统 opencv-python读取摄像头+rviz可视化
测试环境:树莓派ubuntu 18.04.5 ,python 3.6
硬件:免驱USB摄像头
一、安装opencv-python
pip3 install opencv-python
二、opencv读取摄像头
python 版本opencv读取摄像头几行代码即可实现。
import cv2
capture = cv2.VideoCapture(0)`
capture.open(0)
while True:
ret, frame = capture.read()
cv2.imshow("capture", frame) #显示
if cv2.waitKey(100) & 0xff == ord('q'): #按q退出
break
capture.release() #释放摄像头
cv2.destroyAllWindows() #关闭窗口
三、图片转换为ROS图片格式并且在rviz显示
接下来在ROS系统中订阅摄像头的图片信息(在ROS中订阅OPENCV读取的图片,我们要将图片格式转化为ROS可接收的图片格式)
这里我发的是sensor_msgs/Image 消息结构如下,我们只要将以下参数赋值,并发布即可成功的在ROS上发布。
#!/usr/bin/python2
# coding=utf-8
import cv2
import numpy as np
from std_msgs.msg import Header
from sensor_msgs.msg import Image
import rospy
from cv_bridge import CvBridge , CvBridgeError
capture = cv2.VideoCapture(0)
if __name__=="__main__":
capture.open(0)
rospy.init_node('Camera', anonymous=True) #定义节点
image_pub=rospy.Publisher('/image_view/image_raw',
Image,
queue_size = 10) #定义话题
while True:
ret, frame = capture.read()
frame = cv2.flip(frame,0) #镜像操作
frame = cv2.flip(frame,1) #镜像操作
ros_frame = Image()
header = Header(stamp = rospy.Time.now())
header.frame_id = "Camera"
ros_frame.header=header
ros_frame.width = 640
ros_frame.height = 480
ros_frame.encoding = "bgr8"
ros_frame.step = 1920
ros_frame.data = np.array(frame).tostring() #图片格式转换
image_pub.publish(ros_frame) #发布消息
rate = rospy.Rate(10) # 10hz
capture.release()
cv2.destroyAllWindows()
打开RVIZ ,添加Image,并选择图片的话题
实际效果如图,左侧为原图,右侧对图片进行边缘检测。