$search
00001 #!/usr/bin/env python 00002 # 00003 # A simple script to downsample camera images and camera_info messages 00004 # 00005 # Copyright 2012 by Daniel Maier, University of Freiburg 00006 # 00007 # This program is free software: you can redistribute it and/or modify 00008 # it under the terms of the GNU General Public License as published by 00009 # the Free Software Foundation, version 3. 00010 # 00011 # This program is distributed in the hope that it will be useful, 00012 # but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 # GNU General Public License for more details. 00015 # 00016 # You should have received a copy of the GNU General Public License 00017 # along with this program. If not, see <http://www.gnu.org/licenses/>. 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 # copy header 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 #print "image received" 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 #self.image_pub.publish(img) 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()