赞
踩
- #!/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)
-
- def callback(self,data):
- # 使用cv_bridge将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 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()

分析以上例程代码的关键部分:
- import cv2
- from cv_bridge import CvBridge, CvBridgeError
要调用Opencv,必须先导入Opencv模块,另外还应导入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)
定义一个Subscriber接收原始的图像消息,再定义一个Publisher发布Opencv处理后的图像消息还要定义一个句柄,便于调用相关的转换接口
- try:
- cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
- except CvBridgeError as e:
- print (e)
- try:
- self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
- except CvBridgeError as e:
- print (e)
cv2_to_imgmsg()接口的功能是将opencv格式的图像数据转换成ROS图像消息,该接口要求输入图像数据流和数据格式两个参数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。