Go to the documentation of this file.00001
00002
00003
00004
00005 import roslib; roslib.load_manifest('pano_py')
00006 import rospy
00007 import sys
00008 import ros
00009 import cv
00010 import tempfile
00011 import rosbag
00012 from std_msgs.msg import String
00013 from cv_bridge import CvBridge, CvBridgeError
00014 import message_filters
00015 from sensor_msgs.msg import Image, CameraInfo
00016 import os
00017 import pano_py as pano
00018 import pano_cv as pcv
00019
00020 class StitchJob(object):
00021 bag_name = "default.bag"
00022 stitch_file_name = "default.jpg"
00023 camera_info = CameraInfo()
00024 def __init__(self,bag_name,stitch_file_name):
00025 self.bag_name = bag_name
00026 self.stitch_file_name = stitch_file_name
00027 self.bridge = CvBridge()
00028 def stitch(self):
00029 bag = rosbag.Bag(self.bag_name)
00030 saved_camera_info = False
00031 img_n = 0
00032 pano_dir = tempfile.mkdtemp("pano")
00033 image_names = []
00034
00035 camera = pano.Camera()
00036 blur_detector = pano.BlurDetector()
00037
00038 for topic, msg, t in bag.read_messages(topics=['camera_info']):
00039 if ('camera_info' in topic):
00040 print "reading camera info"
00041 K = pcv.Mat(3,3,pcv.CV_32FC1)
00042 K.fromarray(msg.K)
00043 img_size = pcv.Size( msg.width, msg.height)
00044 camera.setCameraIntrinsics(K,pcv.Mat(),img_size)
00045 break
00046
00047 options = pano.Options()
00048 options.camera = camera
00049 options.stitch_size = pcv.Size(4000,2000)
00050 options.directory = pano_dir
00051
00052 params = options.fitter_params
00053 params.error_thresh = 6;
00054 params.inliers_thresh = 15;
00055 params.maxiters = 100;
00056 params.nNeeded = 2;
00057 options.stitch_output = self.stitch_file_name
00058
00059
00060 stitcher = pano.StitchEngine(options)
00061
00062 for topic, msg, t in bag.read_messages(topics=['image']):
00063 if ('image' in topic):
00064 try:
00065 cv_image = self.bridge.imgmsg_to_cv(msg, "rgb8")
00066 b_prob = blur_detector.checkBlur(cv_image)
00067 print "image blur prob = %f" %b_prob
00068 pano_image = pcv.convertCvMat2Mat(cv_image)
00069 stitcher.addNewImage(pano_image)
00070 img_n += 1
00071 except CvBridgeError, e:
00072 print e
00073
00074 bag.close()
00075
00076 blended = cv.CreateMat(2000,4000,cv.CV_8UC3)
00077
00078 stitcher.stitch(blended,self.stitch_cb)
00079
00080 cv.NamedWindow("blended",pcv.CV_WINDOW_KEEPRATIO)
00081 cv.ShowImage("blended",blended)
00082
00083 cv.SaveImage(self.stitch_file_name,blended)
00084 cv.waitKey(0)
00085
00086
00087 return True
00088
00089 def stitch_cb(self,progress):
00090 print "Python progress %d" % progress
00091 return 0
00092
00093 if __name__ == '__main__':
00094 if len(sys.argv) != 3:
00095 print "usage:\n%s pano.bag stitch.jpg" % sys.argv[0]
00096 else:
00097 stitch_job = StitchJob(sys.argv[1],sys.argv[2])
00098 success = stitch_job.stitch()
00099