使用 cv_bridge 發(fā)布/訂閱壓縮圖像
參考 cv_bridge 文檔
發(fā)送圖像
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
# 創(chuàng)建 publisher
cimage_pub = rospy.Publisher("/image/compressed", CompressedImage, queue_size=1)
# 創(chuàng)建并發(fā)送壓縮圖像消息
compressed_msg = CvBridge().cv2_to_compressed_imgmsg(image, "jpg")
compressed_msg.header.stamp = rospy.Time.now()
cimage_pub.publish(compressed_msg)
其中 “jpg” 表示將圖像壓縮的目標(biāo)格式,還有很多其他參數(shù)可選,如下所示
但親測(cè) “jpg” 壓縮比最大,圖像傳輸占用的帶寬最少
bmp, dib
jpeg, jpg, jpe
jp2
png
pbm, pgm, ppm
sr, ras
tiff, tif
接收?qǐng)D像
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
# 定義回調(diào)函數(shù)
def cvbridge_callback(self, data):
image = CvBridge().compressed_imgmsg_to_cv2(data, "bgr8")
# 創(chuàng)建 subscriber
rospy.Subscriber("/image/compressed", CompressedImage, cvbridge_callback, queue_size=1)
其中 “bgr8” 表示將圖像解析為 “bgr8” 格式,也是 opencv 默認(rèn)的圖像格式
使用 opencv 手動(dòng)發(fā)布/訂閱
參考 rospy wiki 教程
參考 opencv 中 imencode 與 imdecode 文檔說(shuō)明
發(fā)送圖像
from sensor_msgs.msg import CompressedImage
import cv2
import numpy as np
# 創(chuàng)建 publisher
cimage_pub = rospy.Publisher("/image/compressed", CompressedImage, queue_size=1)
# 創(chuàng)建并發(fā)送壓縮圖像消息
compressed_msg = CompressedImage()
compressed_msg.header.stamp = rospy.Time.now()
compressed_msg.format = "jpg"
compressed_msg.data = np.array(cv2.imencode('.jpg', image)[1]).tobytes()
cimage_pub.publish(compressed_msg)
“jpg” 作用同上,需要手動(dòng)設(shè)置 compressed_msg.format 表示為壓縮格式(但親測(cè)不設(shè)置對(duì) rqt 顯示和解壓縮也沒(méi)啥影響)
此外,可以手動(dòng)調(diào)節(jié)壓縮圖像的相關(guān)參數(shù),如調(diào)整 jpg 圖像壓縮質(zhì)量為 5(默認(rèn)為 95)
# 創(chuàng)建并發(fā)送壓縮圖像消息
compressed_msg = CompressedImage()
compressed_msg.header.stamp = rospy.Time.now()
compressed_msg.format = "jpg"
compressed_msg.data = np.array(cv2.imencode('.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 5])[1]).tobytes()
cimage_pub.publish(compressed_msg)
接收?qǐng)D像
from sensor_msgs.msg import CompressedImage
import cv2
import numpy as np
# 定義回調(diào)函數(shù)
def cv2_callback(self, data):
image = np.frombuffer(data.data, np.uint8)
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# 創(chuàng)建 subscriber
rospy.Subscriber("/image/compressed", CompressedImage, cv2_callback, queue_size=1)
使用 image_transport 將發(fā)送的圖像轉(zhuǎn)發(fā)為壓縮圖像
參考 image_transport wiki
如果不想寫程序?qū)D像進(jìn)行處理,可以使用 image_transport 包的命令行工具來(lái)將 Image 消息轉(zhuǎn)發(fā)為 CompressedImage 消息
rosrun image_transport republish raw in:=/image compressed out:=/image
該節(jié)點(diǎn)會(huì)自動(dòng)訂閱/image
話題下的Image
消息,并將CompressedImage
格式的消息發(fā)送到/image/compressed
話題下
壓縮的相關(guān)參數(shù)可以通過(guò) rqt 工具箱里的 Dynamic Reconfigure 工具箱進(jìn)行調(diào)整:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853533.html
效果展示
如果 rqt 可視化過(guò)程中顯示錯(cuò)誤:Unable to load plugin for transport ‘cvbridge_compressed’
可參考 【ROS】rqt顯示壓縮圖像話題報(bào)錯(cuò):Unable to load plugin for transport ‘cvbridge_compressed’文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853533.html
到了這里,關(guān)于【ROS】ROS 發(fā)布和訂閱壓縮圖像消息 CompressedImage的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!