Подписка на тему изображений, но не выводит изображения

#python #opencv #ros

Вопрос:

У меня есть следующий код, из которого я изо всех сил пытался получить изображения. В разделе «Сжатые изображения» есть изображения в формате jpeg с камеры моего робота. Ниже приведена моя попытка. Терминал просто выдает мне версии из печати и выходит.

 #!/usr/bin/env python
import cv2
import numpy as np
from timeit import default_timer as timer
from std_msgs.msg import Float64
from sensor_msgs.msg import Image, CompressedImage
from cv_bridge import CvBridge, CvBridgeError
import rospy

import sys
print(sys.version)
print(cv2.__version__)

height = 480
width = 640
global_frame = np.zeros((height,width,3), np.uint8)

def camera_callback(data):

    bridge = CvBridge() 

    try:
        global_frame = bridge.compressed_imgmsg_to_cv2(data)
    except CvBridgeError as e:
        print(e)

    height, width, channels = global_frame.shape
    # print(height)
    cv2.imshow("Original", global_frame)

def lane_pose_publisher():
    # Set the node name
    rospy.init_node('lane_pose_publisher', anonymous=True)

    rospy.Subscriber('/camera/image_raw/compressed', CompressedImage, camera_callback, queue_size = 1)
    # set rate
    rate = rospy.Rate(1000) # 1000hz


if __name__ == '__main__':
    try:
        lane_pose_publisher()
    except rospy.ROSInterruptException:
        pass
 

Ответ №1:

Это потому, что вы не вращаете ROS. Ознакомьтесь с соответствующим руководством по ROS, чтобы создать подписчика, где

 # spin() simply keeps python from exiting until this node is stopped
rospy.spin()
 

вызывается, чтобы убедиться, что РОС может выполнять свою работу (вызывая обратные вызовы, …).

Поэтому вам следует заменить свои строки

 # set rate
rate = rospy.Rate(1000) # 1000hz
 

с крутящимися.

Также вам следует добавить

 cv2.waitKey(1)
 

после звонка

 cv2.imshow("Original", global_frame)
 

чтобы обеспечить отображение изображения.

Комментарии:

1. Если спин не вызывается rate.sleep() в цикле, он будет эффективно работать так же

2. Я заменил эту строку, как уже упоминалось, она по-прежнему не отображает живое видео. Но когда я закончу программу, она покажет мне последний кадр. Это самое значительное улучшение за последние несколько часов…

3. Попробуйте добавить cv2.waitKey(1) после cv2.imshow("Original", global_frame)

4. Вот чего не хватало! Спасибо!