Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 import roslib
00021 roslib.load_manifest('fr_tools')
00022 import sys, message_filters, rospy
00023 from sensor_msgs.msg import Image, CameraInfo
00024 import cv
00025 from cv_bridge import CvBridge, CvBridgeError
00026
00027 def create_camera_info( info_in, width, height):
00028 info_out = info_in
00029 x_fac = float(width)/info_in.width
00030 y_fac = float(height)/info_in.height
00031 info_out.width = width
00032 info_out.height = height
00033 K = list(info_in.K)
00034 P = list(info_in.P)
00035 K[0:3] = [i*x_fac for i in K[0:3]]
00036 K[3:6] = [i*y_fac for i in K[3:6]]
00037 P[0:4] = [i*x_fac for i in P[0:4]]
00038 P[4:8] = [i*y_fac for i in P[4:8]]
00039 info_out.K = tuple(K)
00040 info_out.P = tuple(P)
00041
00042 return info_out
00043
00044 class DownSampler:
00045 def __init__(self, out_prefix, x_fac, y_fac):
00046 self.bridge = CvBridge()
00047 self.image_sub = message_filters.Subscriber( 'image', Image)
00048 self.info_sub = message_filters.Subscriber ( 'camera_info', CameraInfo)
00049 self.image_pub = rospy.Publisher(out_prefix + '/image_color', Image)
00050 self.info_pub = rospy.Publisher(out_prefix + '/camera_info', CameraInfo)
00051 self.ts = message_filters.TimeSynchronizer([self.image_sub, self.info_sub], 10)
00052 self.ts.registerCallback(self.callback)
00053 self.x_fac = x_fac
00054 self.y_fac = y_fac
00055
00056
00057 def callback(self, img, info):
00058
00059 try:
00060 cv_image_in = self.bridge.imgmsg_to_cv(img, desired_encoding=img.encoding)
00061 except CvBridgeError, e:
00062 print e
00063 return
00064 x_fac = self.x_fac
00065 y_fac = self.y_fac
00066 cv_image_out = cv.CreateMat( int( round( cv_image_in.rows * y_fac)), int( round(cv_image_in.cols * x_fac)), cv_image_in.type)
00067 cv.Resize(cv_image_in, cv_image_out)
00068 try:
00069 img_out = self.bridge.cv_to_imgmsg(cv_image_out, img.encoding)
00070 img_out.header = img.header
00071 info_out = create_camera_info(info, img_out.width, img_out.height)
00072 self.image_pub.publish(img_out)
00073
00074 self.info_pub.publish(info_out)
00075 except CvBridgeError, e:
00076 print e
00077 return
00078
00079 if __name__ == '__main__':
00080 rospy.init_node('camera_downsampler', anonymous=True)
00081
00082 if len(sys.argv) < 4:
00083 print "Usage is: %s camera_prefix x_factor y_factor" % (sys.argv[0])
00084 sys.exit(0)
00085 camera_prefix = sys.argv[1]
00086 xfac = float(sys.argv[2])
00087 yfac = float(sys.argv[3])
00088 ds = DownSampler(camera_prefix, xfac, yfac)
00089 rospy.spin()