コード例 #1
0
class ImageEnhancement(Cmd):
    intro = '''====Image enhancement, designed by "Searching Center, Energysh"====
    Type help or ? to list commands.
    '''

    def __init__(self):
        super(ImageEnhancement, self).__init__()

        self.filePath = None

        self.outputAdjustData = None
        self.outputAdjustDataPath = None
        self.outputVideoData = None
        self.outputVideoDataPath = None

        self.videoWriter = None

        self.videoControl = None

        self.adjusters = None

        self.windowName = "AdjustWindow"

        self.videoCapture = None

        self.renderer = None

    def do_adjust(self, argv):
        '''input 3 parameter: filepath adjust_name video_status
            filepath,
            adjust name(snow_scene, forest_scene, asian, white, black... ),
            video status:(Playing, Pause)
        '''

        self.parameterOperation(argv)

        self.adjusterInit()

        self.adjustWindowSetting()

        self.trackbarSetting()

        self.videoOutputSetting()

        self.loopRun()

        self.videoOutput()

        self.unInit()

    # 锐化、饱和度、亮度调节对象
    def adjusterInit(self):

        # print("-------" + self.outputAdjustDataPath)

        self.adjusters = []
        self.renderer = Renderer()

        print(self.outputAdjustDataPath)
        # 读文件,如果存在的话
        if os.path.exists(self.outputAdjustDataPath):
            with open(self.outputAdjustDataPath, "r") as f:
                self.outputAdjustData = f.read()
                adjustDataDict = json.loads(self.outputAdjustData)
                # print(adjustDataDict)
                # outer loop run only once...
                for adjustItem in adjustDataDict[self.outputAdjustDataPath]:
                    for key in adjustItem:
                        d = adjustItem[key]
                        self.adjusters.append(
                            AdjusterFactory.createAdjuster(key, d))

        else:
            len(self.adjusters)
            for adjusterName in AdjusterFactory.defaultAdjustersNames:
                self.adjusters.append(
                    AdjusterFactory.createAdjuster(adjusterName))
            # print(len(self.adjusters))

    def adjustWindowSetting(self):
        cv2.namedWindow(self.windowName)
        cv2.resizeWindow(self.windowName, (400, 512))
        cv2.imshow(self.windowName, np.zeros((10, 512, 3), np.uint8))

    def parameterOperation(self, argv):

        parameters = argv.split(' ')

        if parameters and parameters[0] != "exit" and len(parameters) == 3:
            self.filePath = parameters[0]

            self.outputVideoDataPath = self.filePath + ".mp4"

            self.videoCapture = VideoCapture(self.filePath)
            # 调节输出设定
            self.outputAdjustDataPath = "adjustData/" + parameters[1] + ".txt"
            print(self.outputAdjustDataPath)

            self.videoControl = VideoControl()

            if parameters[2] == "Play":
                self.videoControl.set_videoStatus(VideoStatus['Playing'].value)
            elif parameters[2] == "Pause":
                self.videoControl.set_videoStatus(VideoStatus['Paused'].value)

    def do_exit(self, arg):
        'Stop run'
        print('Stop running')
        # self.close()
        return True

    # trackball control
    def trackbarSetting(self):
        # trackbar设定
        for adjuster in self.adjusters:
            # print(type(adjuster))
            adjuster.createTrackerBar(self.windowName)

        self.videoControl.createTrackerBar(self.windowName)

        self.renderer.createTrackerBar(self.windowName)

    def videoOutputSetting(self):
        # print(self.outputVideoDataPath)
        # print((self.videoCapture.get_size()[
        #       0], self.videoCapture.get_size()[1]))
        self.videoWriter = cv2.VideoWriter(
            self.outputVideoDataPath, cv2.VideoWriter_fourcc(*'MJPG'),
            self.videoCapture.get_fps(),
            (self.videoCapture.get_size()[0], self.videoCapture.get_size()[1]))

    def loopRun(self):

        ref, frame = self.videoCapture.read()

        height, width, _ = np.shape(frame)
        middle = width // 2

        # lasttime

        while True:
            bgr_image = frame

            resultImage = self.renderer.do_Rendering(bgr_image, self.adjusters)

            self.videoWriter.write(resultImage)

            cv2.imshow("image", resultImage)

            if (cv2.waitKey(1) & 0xFF == ord(' ')):
                cv2.waitKey(0)

            if cv2.waitKey(20) & 0xFF == ord('q'):
                break

            if self.videoCapture.isOpened(
            ) and self.videoControl.get_videoStatus(
            ) == VideoStatus.Playing.value:
                ref, frame = self.videoCapture.read()
                if not ref:
                    self.videoControl.set_videoStatus(VideoStatus.Quit.value)
                    break
            if self.videoControl.get_videoStatus() == VideoStatus.Quit.value:
                break
            else:
                continue

    def videoOutput(self):
        adjusterDataDict = []

        for adjusterObj in self.adjusters:
            adjusterDataDict.append(adjusterObj.getData())

        with open(self.outputAdjustDataPath, "w") as f:
            f.write(json.dumps({self.outputAdjustDataPath: adjusterDataDict}))

    def unInit(self):
        self.videoWriter.release()
        self.videoCapture.release()
        cv2.destroyAllWindows()