示例#1
0
class App:
    def __init__(self, camera):
        self.cap = cv.VideoCapture(camera)
        # run `ffmpeg -f v4l2 -list_formats all -i /dev/video0` to check
        # list of available video modes
        resolutions = "1280x720"
        resolutions = [int(i) for i in "1280x720".split('x')]
        self.cap.set(cv.CAP_PROP_FRAME_WIDTH, resolutions[0])
        self.cap.set(cv.CAP_PROP_FRAME_HEIGHT, resolutions[1])

        _, self.frame = self.cap.read()
        self.processor = Processor(self.frame, "camera.yml")
        self.player = Play()
        cv.namedWindow('processed')
        self.rect_sel = RectSelector('processed', self.onrect)

        self.the_rect = 0, 0, self.processor.w, self.processor.h
        self.color = (128, 255, 255)

        self.start_play = False
        self.paused = False
        self.store = False
        self.end = False
        self.winner = None
        self.store_points = []
        self.store_radius = []
        self.location = tuple()

    def reset_store(self):
        self.store_points = []
        self.store_radius = []

    def onrect(self, rect):
        self.the_rect = rect
        print("select rect:", self.the_rect)
        self.reset_store()
        self.store = True

    def read_frame(self, timeout):
        start_time = time.time()
        while True:
            _, self.frame = self.cap.read()
            self.frame, tsps, tsrs = self.processor.centers_detect(
                self.frame.copy(), self.the_rect, self.color, self.store)
            self.store_points.extend(tsps)
            self.store_radius.extend(tsrs)
            if (time.time() - start_time) > timeout:
                break

    def ai_play(self):
        self.read_frame(0.5)
        self.location, self.end, self.winner = self.player.game.play()
        print("AI move:", self.location)
        self.processor.store_coors.append(tuple(self.location))
        self.processor.grid(self.frame, self.store_points, self.store_radius,
                            self.paused)

    def run(self):
        while True:
            if not self.start_play:
                self.read_frame(0)
                self.rect_sel.draw(self.frame)
            elif not self.paused:
                self.ai_play()

            cv.imshow("processed", self.frame)
            k = cv.waitKey(5) & 0xFF
            if k == 27:
                break
            if k == ord('p'):
                print(len(self.store_points))
            if k == ord('c'):
                print("clean store coordinates!")
                self.processor.store_coors = []
            if k == ord('s'):
                cv.imwrite('frame.png', self.frame)
                print("frame saved")

            if k == ord(' ') and self.store:
                self.start_play = True
                self.paused = not self.paused

                if self.paused:
                    self.ai_play()

                else:
                    durations = 1.4
                    while True:
                        self.read_frame(durations)
                        ai_loc = self.processor.store_coors[-1]
                        self.processor.grid(self.frame, self.store_points,
                                            self.store_radius, self.paused)
                        location = self.processor.store_coors[-1]
                        if ai_loc != location:
                            location, self.end, winner = self.player.game.play(
                                location)
                            print("Human move:", location)
                            break
                        print("Human not found,trying..")
                        durations += 0.3
                    self.reset_store()
                if self.end:
                    print("game end")
                    print("the winner is:", winner)
                    break

        cv.destroyAllWindows()