#image #python-2.7 #publish-subscribe #ros
#изображение #python-2.7 #опубликовать-подписаться #ros
Вопрос:
Я пытаюсь подписаться на CameraInfo и изображение формата sensor_msgs.msg и использовать его данные для дальнейшей обработки изображений. Вот несколько строк кода, с которых я начинаю:
from sensor_msgs.msg import CameraInfo, Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
if __name__ == '__main__':
rospy.init_node('node_name')
while ~rospy.is_shutdown():
sub_cam_info = rospy.Subscriber('/camera/rgb/raw_camera_info', CameraInfo)
sub_rgb = rospy.Subscriber('/camera/rgb/raw_image_color', Image)
Отсюда я хочу извлечь заголовок и информацию о данных из ‘sub_cam_info’ и ‘sub_rgb’. Что-то вроде этого:
camera_info_K = sub_cam_info.K
camera_info_dist_model = sub_cam_info.distortion_model
rgb_image = CvBridge().imgmsg_to_cv2(sub_rgb, encoding="rgb8")
А затем использовать эти данные для неискажения изображения:-
rgb_undist = cv2.undistort(rgb_img.data, camera_info_K, camera_info_dist_model)
В основном мне нужна помощь во второй части, т. Е. Извлечение параметров из сообщений CameraInfo и изображений. Однако, если кто-нибудь может помочь мне разобраться с телом всего этого кода! Я уже создаю свои собственные сообщения CameraInfo и RGB, использую их для неискажения и публикации в ROS by, но теперь я хочу получить их из другого модуля ROS и работать с ними.
Ответ №1:
Хорошо для новичков, таких как я, я решил это так:
import message_filters
import cv2
import rospy
from cv_bridge import CvBridge
def callback(rgb_msg, camera_info):
rgb_image = CvBridge().imgmsg_to_cv2(rgb_msg, desired_encoding="rgb8")
camera_info_K = np.array(camera_info.K).reshape([3, 3])
camera_info_D = np.array(camera_info.D)
rgb_undist = cv2.undistort(rgb_image, camera_info_K, camera_info_D)
if __name__ == '__main__':
rospy.init_node('my_node', anonymous=True)
image_sub = message_filters.Subscriber('/ardrone/front/image_raw', Image)
info_sub = message_filters.Subscriber('/ardrone/front/camera_info', CameraInfo)
ts = message_filters.ApproximateTimeSynchronizer([image_sub, info_sub], 10, 0.2)
ts.registerCallback(callback)
rospy.spin()
Итак, моя проблема заключалась в том, как подписаться на две разные темы и использовать их данные для дальнейшей обработки. «message_filters.ApproximateTimeSynchronizer » синхронизировал входящие сообщения в соответствии с отметкой времени с каждым получаемым сообщением и с помощью «ts.registerCallback (обратный вызов)» я смог использовать оба подписанных сообщения вместе для дальнейшей обработки в функции обратного вызова.
Ответ №2:
Вы проверяли, получаете ли вы sub_rgb
изображение с помощью cv2.imshow()
?
И распечатал конфигурацию камеры, чтобы проверить, была ли она получена успешно?
Вам необходимо запустить файл запуска камеры, а затем инициировать node_name
После этого, если вы получите сообщение об ошибке, дайте мне знать.
Я написал код для получения изображения ROS и преобразования его в Mat (формат OpenCV)