How to speed up the video stream publishing?
I have just write a simple node to publish the video that captured from the picamera on a topic, and another node that subscribe to that topic to get the video. But the delay is large, about 5s or more. Anyone can tell me how to optimize the code to speed up the procedure.
environment: raspi3 with camera module; ubuntu mate 16; ROS kinetic.
publisher.py
import time
import rospy
from sensor_msgs.msg import Image
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
from cv_bridge import CvBridge, CvBridgeError
import pdb
def hentai():
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 30
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
rospy.init_node('kuroko', anonymous=True)
pub = rospy.Publisher('line', Image, queue_size=100)
rate = rospy.Rate(30)
bridge = CvBridge()
while not rospy.is_shutdown():
rospy.loginfo("start capturing video from picamera.")
for frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True):
image = frame.array
image_ros = bridge.cv2_to_imgmsg(image, encoding="bgr8")
pub.publish(image_ros)
rawCapture.truncate(0)
rate.sleep()
if __name__ == '__main__':
hentai()
subscriber.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
from sensor_msgs.msg import Image
import cv2
import pdb
from cv_bridge import CvBridge, CvBridgeError
def callback(msg):
bridge = CvBridge()
cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8")
cv2.imshow("frame", cv_image)
if cv2.waitKey(1) & 0xFF == ord('q'):
rospy.loginfo("finished.")
def levelfive():
rospy.init_node('mikoto', anonymous=False)
sub = rospy.Subscriber('line', Image, callback)
rospy.spin()
cv2.destoryAllWindows()
if __name__ == '__main__':
levelfive()
Are you viewing the video on a different computer possibly over wi-fi? The biggest improvement you can make would be to used the compressed image transport.
Actually no. The two nodes were running on the same raspi. Thank you for your advice. I will check the compressed image transport that you mentioned.