Esempio n. 1
0
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src)
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)

    def run(self):
        img = cv2.imread('image.jpg')
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            w, h = getsize(self.frame)
            vis = np.zeros((h, w * 2, 3), np.uint8)
            vis[:h, :w] = self.frame

            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:, w:] = target.image
                draw_keypoints(vis[:, w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                cv2.rectangle(vis, (x0 + w, y0), (x1 + w, y1), (0, 255, 0), 2)

            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    #cv2.fillPoly(vis, [np.int32(tracked.quad)], 255)
                    cv2.polylines(vis, [np.int32(tracked.quad)], True,
                                  (255, 0, 0), 2)

                    xt, yt = tracked.quad[3]
                    font = cv2.FONT_HERSHEY_SIMPLEX
                    cv2.putText(vis, 'Planar track', (xt, yt), font, 1,
                                (0, 0, 255), 2)
                    cv2.circle(vis, (xt, yt), 30, (0, 255, 0), 2)

                    #for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0), np.int32(tracked.p1)):
                    #    cv2.line(vis, (x0+w, y0), (x1, y1), (0, 255, 0))
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv2.imshow('plane', vis)
            ch = cv2.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
Esempio n. 2
0
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv.namedWindow('plane', cv.WINDOW_NORMAL)
        cv.createTrackbar('focal', 'plane', 25, 50, common.nothing)
        cv.resizeWindow('plane', 1920, 1080)
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.add_target(self.frame, rect)

    def run(self):
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            vis = self.frame.copy()
            if playing:
                tracked = self.tracker.track(self.frame)
                for tr in tracked:
                    cv.polylines(vis, [np.int32(tr.quad)], True, (255, 255, 255), 2)
                    for (x, y) in np.int32(tr.p1):
                        cv.circle(vis, (x, y), 2, (255, 255, 255))
                    self.draw_overlay(vis, tr)

            self.rect_sel.draw(vis)
            cv.imshow('plane', vis)
            ch = cv.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == ord('c'):
                self.tracker.clear()
            if ch == 27:
                break

    def draw_overlay(self, vis, tracked):
        x0, y0, x1, y1 = tracked.target.rect
        quad_3d = np.float32([[x0, y0, 0], [x1, y0, 0], [x1, y1, 0], [x0, y1, 0]])
        fx = 0.5 + cv.getTrackbarPos('focal', 'plane') / 50.0
        h, w = vis.shape[:2]
        K = np.float64([[fx*w, 0, 0.5*(w-1)],
                        [0, fx*w, 0.5*(h-1)],
                        [0.0,0.0,      1.0]])
        dist_coef = np.zeros(4)
        _ret, rvec, tvec = cv.solvePnP(quad_3d, tracked.quad, K, dist_coef)
        verts = ar_verts * [(x1-x0), (y1-y0), -(x1-x0)*0.3] + (x0, y0, 0)
        verts = cv.projectPoints(verts, rvec, tvec, K, dist_coef)[0].reshape(-1, 2)
        for i, j in ar_edges:
            (x0, y0), (x1, y1) = verts[i], verts[j]
            cv.line(vis, (int(x0), int(y0)), (int(x1), int(y1)), (255, 255, 0), 2)
Esempio n. 3
0
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        cv2.createTrackbar('focal', 'plane', 25, 50, common.nothing)
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.add_target(self.frame, rect)

    def run(self):
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            vis = self.frame.copy()
            if playing:
                tracked = self.tracker.track(self.frame)
                for tr in tracked:
                    cv2.polylines(vis, [np.int32(tr.quad)], True, (255, 255, 255), 2)
                    for (x, y) in np.int32(tr.p1):
                        cv2.circle(vis, (x, y), 2, (255, 255, 255))
                    self.draw_overlay(vis, tr)

            self.rect_sel.draw(vis)
            cv2.imshow('plane', vis)
            ch = cv2.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == ord('c'):
                self.tracker.clear()
            if ch == 27:
                break

    def draw_overlay(self, vis, tracked):
        x0, y0, x1, y1 = tracked.target.rect
        quad_3d = np.float32([[x0, y0, 0], [x1, y0, 0], [x1, y1, 0], [x0, y1, 0]])
        fx = 0.5 + cv2.getTrackbarPos('focal', 'plane') / 50.0
        h, w = vis.shape[:2]
        K = np.float64([[fx*w, 0, 0.5*(w-1)],
                        [0, fx*w, 0.5*(h-1)],
                        [0.0,0.0,      1.0]])
        dist_coef = np.zeros(4)
        ret, rvec, tvec = cv2.solvePnP(quad_3d, tracked.quad, K, dist_coef)
        verts = ar_verts * [(x1-x0), (y1-y0), -(x1-x0)*0.3] + (x0, y0, 0)
        verts = cv2.projectPoints(verts, rvec, tvec, K, dist_coef)[0].reshape(-1, 2)
        for i, j in ar_edges:
            (x0, y0), (x1, y1) = verts[i], verts[j]
            cv2.line(vis, (int(x0), int(y0)), (int(x1), int(y1)), (255, 255, 0), 2)
Esempio n. 4
0
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv.namedWindow('plane')
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)

    def run(self):
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            w, h = getsize(self.frame)
            vis = np.zeros((h, w * 2, 3), np.uint8)
            vis[:h, :w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:, w:] = target.image
                draw_keypoints(vis[:, w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                cv.rectangle(vis, (x0 + w, y0), (x1 + w, y1), (0, 255, 0), 2)

            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    cv.polylines(vis, [np.int32(tracked.quad)], True,
                                 (255, 255, 255), 2)
                    for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0),
                                                  np.int32(tracked.p1)):
                        cv.line(vis, (x0 + w, y0), (x1, y1), (0, 255, 0))
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv.imshow('plane', vis)
            ch = cv.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        cv2.moveWindow('plane', 100, 100)
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.addTargetSamples(self.frame, rect)

    def run(self):
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            w, h = getsize(self.frame)
            vis = np.zeros((h, w*2, 3), np.uint8)
            vis[:h,:w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:,w:] = target.image
                draw_keypoints(vis[:,w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                cv2.rectangle(vis, (x0+w, y0), (x1+w, y1), (0, 255, 0), 2)

            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    cv2.polylines(vis, [np.int32(tracked.quad)], True, (255, 255, 255), 2)
                    for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0), np.int32(tracked.p1)):
                        cv2.line(vis, (x0+w, y0), (x1, y1), (0, 255, 0))
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv2.imshow('plane', vis)
            ch = cv2.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
Esempio n. 6
0
def track_from_file(input_image_file, check_images_dir, result_dir):
    print "Tracking", input_image_file
    tracker = PlaneTracker()

    # ------------ INPUT IMAGE
    input_image = cv2.imread(input_image_file)
    input_image = cv2.resize(input_image, (0,0), fx=SCALE_DOWN_COEF, fy=SCALE_DOWN_COEF)
    # input_image = rotateImage(input_image, -90)
    input_image_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)

    height, width = input_image.shape[:2]
    # ------------

    tracker.clear()
    tracker.add_target(input_image_gray, (0, 0, width, height))

    # ----------------
    for fn in os.listdir(check_images_dir):
        # print os.path.join(imagesDir, fn)
        filename = os.path.join(check_images_dir, fn)

        if os.path.isfile(filename):
            print "Checking", filename

            fName, fExtension = os.path.splitext(fn)
            inpfName, _ = os.path.splitext(os.path.split(input_image_file)[1])

            # print fn, fName, fExtension
            inFile = os.path.join(check_images_dir, fn)
            # print 'inFile =', inFile

            resFile = os.path.join(result_dir, inpfName + 'r' + fName + fExtension)
            # print 'resFile =', resFile

            # DO SMTH HERE inFile and resFile
            im = cv2.imread(inFile)
            im = cv2.resize(im, (0,0), fx=SCALE_DOWN_COEF, fy=SCALE_DOWN_COEF)
            # im = rotateImage(im, -90)
            imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)


            # im = rotateImage(imgray, -90)

            # draw corners
            # for i in range(len(corners)):
            # print i, corners[i][0]
            #     cv2.circle(im, (corners[i][0][0], corners[i][0][1]), 50, (0,255,0), 8)


            # track & match features
            tracked = tracker.track(imgray)

            if tracked:
                print "Tracked generation started"

                resImage = np.zeros((height, width * 2, 3), np.uint8)
                resImage[:height, :width] = input_image
                resImage[:height, width:width * 2] = im

                # keypoints = tracked[0].target.keypoints
                # resImage = cv2.drawKeypoints(resImage, keypoints, color=(0, 255, 0),
                #                                     flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

                for tr in tracked:
                    for p0, p1 in zip(tr.p0, tr.p1):

                        from_point = (int(p0[0]), int(p0[1]))
                        to_point = (int(p1[0] + width), int(p1[1]))
                        cv2.line(resImage, from_point, to_point, color=(255, 0, 0))

                cv2.imwrite(resFile, rotateImage(resImage, -90))

                print 'images ', input_image_file, 'and', filename, ' are similar', ' len.p0=', len(
                    tracked[0].p0), ' len.p1=', len(tracked[0].p1)

                print_apropriate_room(filename)
                # else:
                #     print 'images are not similar'
                print "Tracked generation finished"
class App:
    def __init__(self, src):
        self.drone = libardrone.ARDrone(is_ar_drone_2=True)
        #self.cap = video.create_capture(src)
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        cv2.createTrackbar('focal', 'plane', 25, 50, common.nothing)
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.add_target(self.frame, rect)

    def run(self):
        try:
            while True:
                playing = not self.paused and not self.rect_sel.dragging
                if playing or self.frame is None:
                    #ret, frame = self.cap.read()
                    #if not ret:
                    #    break
                    self.frame = cv2.cvtColor(self.drone.get_image(),
                                              cv2.COLOR_BGR2RGB)

                vis = self.frame.copy()
                if playing:
                    tracked = self.tracker.track(self.frame)
                    for tr in tracked:
                        cv2.polylines(vis, [np.int32(tr.quad)], True,
                                      (255, 255, 255), 2)
                        for (x, y) in np.int32(tr.p1):
                            cv2.circle(vis, (x, y), 2, (255, 255, 255))
                        self.draw_overlay(vis, tr)

                self.rect_sel.draw(vis)
                cv2.imshow('plane', vis)
                ch = cv2.waitKey(1)
                if ch == ord(' '):
                    self.paused = not self.paused
                if ch == ord('c'):
                    self.tracker.clear()
                if ch == 27:
                    break
        finally:
            cv2.destroyAllWindows()
            self.drone.emergency()
            self.drone.reset()
            self.drone.halt()

    def draw_overlay(self, vis, tracked):
        x0, y0, x1, y1 = tracked.target.rect
        quad_3d = np.float32([[x0, y0, 0], [x1, y0, 0], [x1, y1, 0],
                              [x0, y1, 0]])
        fx = 0.5 + cv2.getTrackbarPos('focal', 'plane') / 50.0
        h, w = vis.shape[:2]
        K = np.float64([[fx * w, 0, 0.5 * (w - 1)], [0, fx * w, 0.5 * (h - 1)],
                        [0.0, 0.0, 1.0]])
        dist_coef = np.zeros(4)
        ret, rvec, tvec = cv2.solvePnP(quad_3d, tracked.quad, K, dist_coef)
        verts = ar_verts * [(x1 - x0),
                            (y1 - y0), -(x1 - x0) * 0.3] + (x0, y0, 0)
        verts = cv2.projectPoints(verts, rvec, tvec, K,
                                  dist_coef)[0].reshape(-1, 2)
        for i, j in ar_edges:
            (x0, y0), (x1, y1) = verts[i], verts[j]
            cv2.line(vis, (int(x0), int(y0)), (int(x1), int(y1)),
                     (255, 255, 0), 2)
class App:
    def __init__(self, src):
        image = cv.imread(src, 1)
        small = cv.resize(image, (0,0), fx=0.125, fy=0.125) # resizing the image, as high resolution image taken
        self.frame = small
        self.paused = False
        self.tracker = PlaneTracker()

        cv.namedWindow('Selected Region')
        # cv.setMouseCallback('Selected Region', self.draw_circle_corner)
        self.rect_sel = common.RectSelector('Selected Region', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)

    def run_original(self):

        while True:
            playing = not self.paused and not self.rect_sel.dragging
            # flag used to quit imaging, when the size detected.
            flag = 0
            # if playing or self.frame is None:
            #     # ret, frame = self.cap.read()
            #     if not ret:
            #         break
            #     self.frame = frame.copy()
            # size of the frame (image) - used to draw rectangle
            w, h = getsize(self.frame)
            vis = np.zeros((h, w*2, 3), np.uint8)
            # copy to the image (original)
            vis[:h,:w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:,w:] = target.image
                draw_keypoints(vis[:,w:], target.keypoints)
                x0, y0, x1, y1 = target.rect # rectangle coordinates
                cv.rectangle(vis, (x0+w, y0), (x1+w, y1), (0, 255, 0), 2) # green line drawn
                # finding the width of the region
                width_region = distance(x0, x1, y0, y1)
                flag = 1 # set flag = 1, quit the program!
            self.rect_sel.draw(vis)
            cv.imshow('Selected Region', vis) # show the image
            ch = cv.waitKey(1)
            if ch == 27 or flag == 1:
                print("Quitting")
                return width_region

    def run(self, Cover_Dimensions, Actual_Dimensions):
        '''
        Runs the program, of selection of the image's region. Approximates the
        dimensions of the cover based on given dimensions.
        '''
        while True:
            # flag used to quit imaging, when the size detected.
            flag = 0
            playing = not self.rect_sel.dragging

            # get size of the book cover
            w, h = getsize(self.frame)
            vis = np.zeros((h, w*2, 3), np.uint8)
            vis[:h,:w] = self.frame

            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:,w:] = target.image
                draw_keypoints(vis[:,w:], target.keypoints)
                x0, y0, x1, y1 = target.rect # get the selected region coordinates
                cv.rectangle(vis, (x0+w, y0), (x1+w, y1), (0, 255, 0), 2)

                Region_Dimensions = [x1 - x0, y1 - y0]
                print("Region_Dimensions:", Region_Dimensions)
                # Ratio of the cover dimensions (width) to region dimensions (width)
                # similarly for height
                ratio_width = float(Cover_Dimensions)/(Region_Dimensions[0])

                # Hard coded the actual width and height of the region.
                # Actual width (in cm) = 14
                # Actual height (in cm) = 1.1
                width_of_book = ratio_width * Actual_Dimensions[0]
                # height_of_book = ratio_height * Actual_Dimensions[1]

            # Optional (useful in case of video source)
            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    cv.polylines(vis, [np.int32(tracked.quad)], True, (255, 255, 255), 2)
                    for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0), np.int32(tracked.p1)):
                        cv.line(vis, (x0+w, y0), (x1, y1), (0, 255, 0))
                        print("Detected")
                        # break when the region is detected.
                        flag = 1
                        break
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv.imshow('Selected Region', vis)
            cv.waitKey(1)
            if flag == 1:
                print("Dimensions of the book : ", width_of_book)
                return
Esempio n. 9
0
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src)
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)

    def run(self):
        def find_line(p0, p1):
            x0, y0 = p0
            x1, y1 = p1
            k = (x1 - x0) / (y1 - y0)
            b = y1 - k * x0
            return k, b

        def cross(l0, l1):
            k0, b0 = l0
            k1, b1 = l1
            x = (b1 - b0) / (k0 - k1)
            y = k0 * x + b0
            return x, y

        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            w, h = getsize(self.frame)
            vis = np.zeros((h, w * 2, 3), np.uint8)
            vis[:h, :w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:, w:] = target.image
                draw_keypoints(vis[:, w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                cv2.rectangle(vis, (x0 + w, y0), (x1 + w, y1), (0, 255, 0), 2)

            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    cv2.polylines(vis, [np.int32(tracked.quad)], True,
                                  (255, 255, 255), 2)
                    # print([np.int32(tracked.quad)])
                    p0, p1, p2, p3 = np.int32(tracked.quad)
                    l0 = find_line(p0, p2)
                    l1 = find_line(p1, p3)
                    x, y = cross(l0, l1)
                    z = 3 * 180 / (p3[1] - p0[1]) * 1
                    print(x, y, z)
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv2.imshow('plane', vis)
            ch = cv2.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
Esempio n. 10
0
class App:
    def __init__(self, src):
        #self.cap = video.create_capture(src, presets['book'])
	self.image_pub = rospy.Publisher("image_topic_2",Image, queue_size=10)
	self.image_sub = rospy.Subscriber("/camera/rgb/image_raw",Image,self.callback)
	self.bridge = CvBridge()
	#dtype, n_channels = br.encoding_as_cvtype2('8UC3')
	#this.im = np.ndarray(shape=(480, 640, n_channels), dtype=dtype)
	self.cv_image = None
        self.frame = None
	#self.count = 1
        self.paused = False
        self.tracker = PlaneTracker()

        cv2.namedWindow('plane')
        self.rect_sel = common.RectSelector('plane', self.on_rect)
	
	self.tracker.clear()

	rospack = rospkg.RosPack()	
	labPath = rospack.get_path('laboratorio3')

	files = ['Cercano', 'Medio', 'Lejano','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
	
	for f in files:
		rectanguloFile = os.path.join(labPath, 'detectarCono/rect{}.pkl'.format(f))
		frameFile = os.path.join(labPath, 'detectarCono/frame{}.pkl'.format(f))
	
		with open(rectanguloFile, 'rb') as f:
			rectangulo = pickle.load(f)
		with open(frameFile, 'rb') as f:
			frame = pickle.load(f)
		self.tracker.add_target(frame, rectangulo)

	self.pubVel = rospy.Publisher('/cmd_vel', Twist , queue_size=10)
	self.pubNavegacion = rospy.Publisher('/laboratorio3/exploration', String , queue_size=10)

	self.reiniciar_exploracion_timer = False
	#rospy.init_node('talker', anonymous=True)

    def callback(self,data):
        try:
	    self.cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
	    #print(self.cv_image)
        except CvBridgeError as e:
            print(e)
	#(rows,cols,channels) = self.cv_image.shape
        #if cols > 60 and rows > 60 :
        #    cv2.circle(self.cv_image, (50,50), 10, 255)

        #cv2.imshow("Image window", self.cv_image)
        #cv2.waitKey(3)

        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(self.cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)
    
    def on_rect(self, rect):
        #self.tracker.clear()
        #self.tracker.add_target(self.frame, rect)
	#print('ON_RECT')
	#with open('rect'+str(self.count)+'.pkl', 'wb') as f:
	#	pickle.dump(rect, f, pickle.HIGHEST_PROTOCOL)
	#with open('frame'+str(self.count)+'.pkl', 'wb') as f:
	#	pickle.dump(self.frame, f, pickle.HIGHEST_PROTOCOL)
	#self.count = self.count + 1
	self.tracker.clear()

	rospack = rospkg.RosPack()	
	labPath = rospack.get_path('laboratorio3')

	files = ['Cercano', 'Medio', 'Lejano','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
	
	for f in files:
		rectanguloFile = os.path.join(labPath, 'detectarCono/rect{}.pkl'.format(f))
		frameFile = os.path.join(labPath, 'detectarCono/frame{}.pkl'.format(f))
	
		with open(rectanguloFile, 'rb') as f:
			rectangulo = pickle.load(f)
		with open(frameFile, 'rb') as f:
			frame = pickle.load(f)
		self.tracker.add_target(frame, rectangulo)
	
    def reiniciar_exploracion(self, event):
	self.reiniciar_exploracion_timer = False
	self.pubNavegacion.publish('START')

    def run(self):
	direccion = None
        while not rospy.is_shutdown():
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
		#print(self.cv_image)
                ret = True
		frame = self.cv_image
		#print(self.cv_image)
		#print("**************************** frame")
		#print(frame)
		#ret, frame = self.cap.read()
		if not ret:
                    break
                self.frame = frame.copy()
	    
            w, h = getsize(self.frame)
            vis = np.zeros((h, w*2, 3), np.uint8)
            vis[:h,:w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:,w:] = target.image
                draw_keypoints(vis[:,w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
		#print(x0,y0,x1,y1)
                cv2.rectangle(vis, (x0+w, y0), (x1+w, y1), (0, 255, 0), 2)
	    
            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
		    tracked = tracked[0]
		    if not self.reiniciar_exploracion_timer:
		    	self.pubNavegacion.publish('STOP')
			self.reiniciar_exploracion_timer = True
		    	rospy.Timer(rospy.Duration(15), self.reiniciar_exploracion)
		    #Aca se imprimen los 4 puntos que genera
		    #print(str(np.int32(tracked.quad[0])))
		    #print(str(np.int32(tracked.quad[1])))
		    #print(str(np.int32(tracked.quad[2])))
		    #print(str(np.int32(tracked.quad[3])))
		    #Este es el punto medio del poligono que genera. 
		    ptoMedio = (np.int32(tracked.quad[0]) + np.int32(tracked.quad[1]) + np.int32(tracked.quad[2]) + np.int32(tracked.quad[3]))/4
		    direccion = (ptoMedio[0]-320)/-320.0
		    twist = Twist(Vector3(15,0,0),Vector3(0,0,direccion))
		    self.pubVel.publish(twist)
		    
                    cv2.polylines(vis, [np.int32(tracked.quad)], True, (255, 255, 255), 2)
                    for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0), np.int32(tracked.p1)):
                        cv2.line(vis, (x0+w, y0), (x1, y1), (0, 255, 0))
		else:
		    if self.reiniciar_exploracion_timer:
			direccion = direccion or 0.5
		    	twist = Twist(Vector3(0 if direccion > 0.2 else 10,0,0),Vector3(0,0, direccion if direccion > 0.2 else 0))
		    	self.pubVel.publish(twist)

            draw_keypoints(vis, self.tracker.frame_points)
	    
            self.rect_sel.draw(vis)
            cv2.imshow('plane', vis)
            ch = cv2.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
class App:
    def __init__(self, src):
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.paused = False
        self.tracker = PlaneTracker()

        cv.namedWindow('plane')
        self.rect_sel = common.RectSelector('plane', self.on_rect)

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)

    def run(self):
        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()

            blue = cv.cvtColor(frame, cv.COLOR_BGR2Luv)
            # Display the resulting frame
            cv.imshow('self.frame', blue)

            w, h = getsize(self.frame)
            vis = np.zeros((h, w * 2, 3), np.uint8)
            vis[:h, :w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:, w:] = target.image
                draw_keypoints(vis[:, w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                #cv.rectangle(vis, (x0+w, y0), (x1+w, y1), (255, 0, 0), 2)
                center_x = int((x0 + x1 + 2 * w) / 2)
                center_y = int((y0 + y1) / 2)
                r_x = int(abs((x0 - x1) / 2))
                r_y = int(abs((x0 - x1) / 2))
                radius = int(math.sqrt((r_x * r_x) + (r_y * r_y)))

                cv.circle(vis, (center_x, center_y), radius, (0, 0, 255), 2)
            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    cv.polylines(vis, [np.int32(tracked.quad)], True,
                                 (255, 0, 255), 2)
                    for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0),
                                                  np.int32(tracked.p1)):
                        cv.line(vis, (x0 + w, y0), (x1, y1), (255, 0, 0))
            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv.imshow('plane', vis)
            ch = cv.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            if ch == 27:
                break
Esempio n. 12
0
class App(object):
    def __init__(self, src):
        cv.namedWindow(WIN_NAME)
        cv.moveWindow(WIN_NAME, 0, 0)
        self.cap = video.create_capture(src, presets['book'])
        self.frame = None
        self.auto_output_frame = None
        self.paused = False
        self.tracker = PlaneTracker()
        self.rect_sel = common.RectSelector('plane', self.on_rect)
        self.user_selected_rect = None
        self.focal_length = 0.0
        self.horizontal_angel = 0.0
        self.known_distance = 200
        self.KNOWN_WIDTH = 40
        self.KNOWN_HEIGHT = 40
        self.msg = None
        self.serial = 0
        self.auto_save = False
        self.auto_serial = 0

    def on_rect(self, rect):
        self.tracker.clear()
        self.tracker.add_target(self.frame, rect)
        # rasmus hacked {
        self.user_selected_rect = rect
        x0, y0, x1, y1 = rect
        crop_img = self.frame[y0:y1, x0:x1]
        #print('type: {}, {}, {}'.format(rect, type(rect), type(rect[0])))
        fn = FRAME_FN
        self.write_file(fn, self.frame)
        fn = 'rect.jpg'
        self.write_file(fn, crop_img)
        self.save_config(rect)
        # rasmus hacked }

    def save_config(self, rect):
        fn = FRAME_FN
        # elements in 'rect' is numpy.int16, convert them into int,
        # so that json could store
        rects = list(map(int, rect))
        data = {'fn': fn, 'rect': rects}
        print(data)
        j = json.dumps(data)  # now j is a string to keep json data
        with open('h**o.json', 'w') as h**o:
            h**o.write(j)

    def load_setting(self, fn):
        data = myutil.read_jsonfile(fn, debug=True)
        try:
            tmp = data['auto_save']
            self.auto_save = tmp
        except:
            pass
        print('setting loaded, auto_save: {}'.format(self.auto_save))

    def load_config(self, fn):
        data = myutil.read_jsonfile(fn, debug=True)
        #print(data['fn'])
        fn = data.get('fn')
        frame = np.zeros((640, 480, 3), np.uint8)
        if myutil.isfile(fn):
            frame = cv.imread(fn)
        else:
            print('file not found: {}'.format(fn))
            return None

        rect = data['rect']
        self.focal_length = self.calc_focallength(rect)

        rect = tuple(map(np.int16, rect))
        print(rect)
        self.tracker.clear()
        self.tracker.add_target(frame, rect)
        print('preset loaded')
        return frame

    def calc_focallength(self, rect):
        # initialize the known distance from the camera to the object, which
        # preset distance from samples
        self.known_distance = 200
        # initialize the known object width, which in this case, the piece of
        # paper, unit mm
        width = rect[2] - rect[0]
        focalLength = (width * self.known_distance) / self.KNOWN_WIDTH
        print('width: {} focal length: {:.2f}'.format(width, focalLength))
        return focalLength

    def distance_to_camera(self, knownWidth, focalLength, perWidth):
        # compute and return the distance from the maker to the camera
        if perWidth == 0.0:
            return 0.0
        return (knownWidth * focalLength) / perWidth

    @staticmethod
    def get_dist2d(p1, p2):
        return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

    @staticmethod
    def write_file(fn, frame):
        cv.imwrite(fn, frame)
        print('output to %s' % fn)

    @staticmethod
    def get_slope(p1, p2):
        delta_x = float(p2[0] - p1[0])
        delta_y = float(p2[1] - p1[1])
        if delta_x == 0:
            return -1.0
        return math.fabs(delta_y / delta_x)

    @staticmethod
    def get_degree(slope):
        if slope < 0.0:
            return 90.0
        deg = math.atan(slope) * 180.0 / math.pi
        return deg

    def show_wtf(self, wtf):
        print('wtf: {} -- {}'.format(wtf, self.user_selected_rect))

    def check_wtf(self, wtf, debug=False):
        self.msg = None
        for ww in wtf:
            xx, yy = ww
            if xx > 640 or yy > 480 or xx < 0 or yy < 0:
                if debug:
                    print('OOB')
                return False
        ang1 = self.get_degree(self.get_slope(wtf[0], wtf[1]))
        ang2 = self.get_degree(self.get_slope(wtf[2], wtf[3]))
        if ang1 > 30.0 or ang2 > 30:
            if debug:
                print('h ang')
            return False

        self.horizontal_angel = ang1
        dist = self.get_dist2d(wtf[0], wtf[1])
        h_dist = dist * math.cos(self.horizontal_angel * math.pi / 180.0)
        detph = self.distance_to_camera(self.KNOWN_WIDTH, self.focal_length,
                                        h_dist)
        #print('ang{:4.2f} dist{:4.2f}'.format(self.horizontal_angel, dist), end=' ')
        #print('hdist {:4.2f}'.format(h_dist), end=' ')
        self.msg = 'depth {:4.2f} mm'.format(detph)

        s1 = self.get_slope(wtf[1], wtf[2])
        s2 = self.get_slope(wtf[0], wtf[3])
        if s1 < 0.0 or s2 < 0.0:
            if debug:
                print('t slopy')
            return False
        ang1 = self.get_degree(s1)
        ang2 = self.get_degree(s2)
        if ang1 < 60.0 or ang2 < 60.0:
            if debug:
                print('too s')
            return False

        return True

    def draw_result(self, img, wtf):
        cv.putText(img,
                   self.msg, (50, 50),
                   cv.FONT_HERSHEY_SIMPLEX,
                   1.0, (0, 0, 0),
                   lineType=cv.LINE_AA)
        cv.polylines(img, [np.int32(wtf)], True, (255, 255, 255), 2)

    def run(self):
        setting_fn = 'setting.json'
        if myutil.isfile(setting_fn):
            print('setting exists')
            self.load_setting(setting_fn)
        # load preset frame and rect
        if True and myutil.isfile('h**o.json'):
            print('preset exists')
            tmp_frame = self.load_config('h**o.json')
            #self.frame = tmp_frame

        print('test: {}'.format(
            self.distance_to_camera(self.KNOWN_WIDTH, self.focal_length, 135)))

        while True:
            playing = not self.paused and not self.rect_sel.dragging
            if playing or self.frame is None:
                ret, frame = self.cap.read()
                if not ret:
                    break
                self.frame = frame.copy()
                self.auto_output_frame = frame.copy()

            w, h = getsize(self.frame)
            vis = np.zeros((h, w * 2, 3), np.uint8)
            # if tmp_frame:
            #     vis[:,w:] = tmp_frame
            vis[:h, :w] = self.frame
            if len(self.tracker.targets) > 0:
                target = self.tracker.targets[0]
                vis[:, w:] = target.image
                draw_keypoints(vis[:, w:], target.keypoints)
                x0, y0, x1, y1 = target.rect
                cv.rectangle(vis, (x0 + w, y0), (x1 + w, y1), (0, 255, 0), 2)

            is_ok_to_export = False
            if playing:
                tracked = self.tracker.track(self.frame)
                if len(tracked) > 0:
                    tracked = tracked[0]
                    wtf = np.int32(tracked.quad)
                    if self.check_wtf(wtf):
                        self.draw_result(vis, wtf)
                        cv.fillPoly(vis, [wtf], (255, 0, 0))
                        for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0),
                                                      np.int32(tracked.p1)):
                            cv.line(vis, (x0 + w, y0), (x1, y1), (0, 255, 0))
                        is_ok_to_export = True
                        if self.auto_save:
                            self.draw_result(self.auto_output_frame, wtf)
                            fn = 'autosave_{:04d}.png'.format(self.auto_serial)
                            self.save_image(fn, self.auto_output_frame)
                            self.auto_serial += 1

            draw_keypoints(vis, self.tracker.frame_points)

            self.rect_sel.draw(vis)
            cv.imshow(WIN_NAME, vis)
            ch = cv.waitKey(1)
            if ch == ord(' '):
                self.paused = not self.paused
            elif ch == 27:
                break
            elif ch == ord('s'):
                fn = 'saved_{:04d}.png'.format(self.serial)
                self.serial += 1
                self.save_image(fn, vis)

    def save_image(self, fn, img):
        print('save image to {}'.format(fn))
        cv.imwrite(fn, img)