一图看懂
比比一些叙述
我们在使用ROS作控制任务时,一般是是需要甬道视觉控制的。或者说单独用ROS部署一些视觉模块。
这个个时候我们一般会以来opencv工具来实现一个功能,或者基础图像处理功能,比如提取图像尺寸,灰度转换之类的。
ROS个的数据格式和opencv的个是不同,ROS在传输图像时需要使用专门的数据个时进行传输,比如订阅摄像头采集的数据,传过来就是ROS格式的数据,这个时候并不适合Opencv直接处理。因此我们需要使用imgmsg_to_cv2将图像从ROS信息格式转换成cv格式。当ROS处理好之后,我们还需要继续传输该处理好的图像数据时,还需要再用cv2_to_imgmsg 将数据转成ROS信息格式。
一个例子
使用古月居的例子
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image
class image_converter:
def __init__(self):
# 创建cv_bridge,声明图像的发布者和订阅者
self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
self.bridge = CvBridge()
self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)
#图像刚从摄像机订阅过来,图像格式是ROS的信息格式。这是还无法使用opencv处理
def callback(self,data):
# 使用cv_bridge的imgmsg_to_cv2将ROS的图像数据转换成OpenCV的图像格式
try:
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print e
# 在opencv的显示窗口中绘制一个圆,作为标记
(rows,cols,channels) = cv_image.shape
if cols > 60 and rows > 60 :
cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
# 显示Opencv格式的图像
cv2.imshow("Image window", cv_image)
cv2.waitKey(3)
# 这个时候想将通过opencv处理好的图像再使用ROS节点发送发出去
#因此,需要再使用cv2_to_imgmsg将opencv格式额数据转换成ros image格式的数据发布
try:
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
except CvBridgeError as e:
print e
if __name__ == '__main__':
try:
# 初始化ros节点
rospy.init_node("cv_bridge_test")
rospy.loginfo("Starting cv_bridge_test node")
image_converter()
rospy.spin()
except KeyboardInterrupt:
print "Shutting down cv_bridge_test node."
cv2.destroyAllWindows()