订阅ros中编码为16UC1的深度图像,并利用opencv将深度图中距离小于80的区域进行框选的python代码
时间: 2024-03-01 10:51:17 浏览: 21
以下是订阅ROS中编码为16UC1的深度图像,并利用OpenCV将深度图中距离小于80的区域进行框选的Python代码示例:
```python
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
class DepthImageSubscriber:
def __init__(self):
self.bridge = CvBridge()
self.depth_sub = rospy.Subscriber("depth_image_topic", Image, self.callback)
def callback(self, data):
try:
# 将ROS消息转换为OpenCV格式
depth_image = self.bridge.imgmsg_to_cv2(data, desired_encoding="passthrough")
# 深度图中距离小于80的像素设为255,其余设为0
depth_mask = np.zeros_like(depth_image, dtype=np.uint8)
depth_mask[(depth_image < 80) & (depth_image > 0)] = 255
# 在深度图中绘制边框
contours, _ = cv2.findContours(depth_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(depth_image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示深度图和深度图中距离小于80的区域框选结果
cv2.imshow("Depth Image", depth_image)
cv2.waitKey(3)
except Exception as e:
print(e)
if __name__ == '__main__':
rospy.init_node('depth_image_subscriber', anonymous=True)
depth_image_subscriber = DepthImageSubscriber()
try:
rospy.spin()
except KeyboardInterrupt:
print("Shutting down...")
cv2.destroyAllWindows()
```
在这个例子中,我们使用了ROS的`rospy`模块订阅了一个名为“depth_image_topic”的话题,该话题发布了编码为16UC1的深度图像。然后使用`cv_bridge`模块将ROS消息转换为OpenCV格式,根据深度图中像素的值创建一个二进制掩码图像,将深度小于80的像素设为255,其余设为0。然后利用OpenCV的`findContours()`函数在掩码图像中找到所有轮廓,并使用`rectangle()`函数在深度图中绘制边框。最后使用`imshow()`函数显示深度图和深度图中距离小于80的区域框选结果。
注意,由于深度图像是编码为16UC1的图像,需要使用`desired_encoding="passthrough"`参数将其转换为OpenCV格式。同时,由于深度图像可能存在无效像素值(例如0),在创建二进制掩码图像时需要特别处理。