예제 #1
0
    def output(self):

        originNum = int(self.movie.get(cv2.CAP_PROP_FRAME_COUNT))
        reductedNum = int(self.movie.get(cv2.CAP_PROP_FRAME_COUNT)/self.REDUCT_RATE)

        # 減らしたフレームを補完しつつ、オーバーレイ位置の配列を作成
        allFaces = [[-1, -1, "",100.0] for j in range(originNum+1)]
        for i in range(reductedNum):
            if self.faces[i][0] == -1:
                dummy=1
            # 次のフレームに顔がなければそのフレームだけ書き出し
            elif self.faces[i+1][0] == -1:
                allFaces[i*self.REDUCT_RATE] = self.faces[i]            
            # オーバレイ画像が同じなら連続として処理
            elif self.faces[i][2] == self.faces[i+1][2]:
                for j in range(self.REDUCT_RATE):
                    allFaces[i*self.REDUCT_RATE+j][0] = (self.faces[i+1][0]-self.faces[i][0])/self.REDUCT_RATE * j + self.faces[i][0]
                    allFaces[i*self.REDUCT_RATE+j][1] = (self.faces[i+1][1]-self.faces[i][1])/self.REDUCT_RATE * j + self.faces[i][1]
                    allFaces[i*self.REDUCT_RATE+j][2] = self.faces[i][2]
                    allFaces[i*self.REDUCT_RATE+j][3] = (self.faces[i+1][3]-self.faces[i][3])/self.REDUCT_RATE * j + self.faces[i][3]

            # それ以外はそのフレームだけ書き出し
            else:
                allFaces[i*self.REDUCT_RATE] = self.faces[i]

        # 最後のフレームに顔があればそのまま書き出し
        if self.faces[reductedNum][0] != -1:
            allFaces[reductedNum*self.REDUCT_RATE] = self.faces[reductedNum]

        ################ここまでで顔位置データ作成#########################
        ###################ここから書き出し###############################
        # 書き込み先のファイルを開く
        result = "C:/Development/VSProject/MovieOverlay/result/arajin_v8.mp4" 
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        out = cv2.VideoWriter(result, fourcc,  self.fps, (int(self.width), int(self.height)))
        self.ol_image_path=""
        self.ol_image=None

        self.movie.set(cv2.CAP_PROP_POS_FRAMES, 0)
        for i in range(int(self.movie.get(cv2.CAP_PROP_FRAME_COUNT))):
            ret, frame = self.movie.read()
            if ret==False:
                break
            # オーバレイ画像が選択されており、読み込み成功していればオーバレイ
            if self.ol_image_path != allFaces[i][2]:
                self.ol_imgae_path = allFaces[i][2]
                self.ol_image = cv2.imread(self.ol_imgae_path,cv2.IMREAD_UNCHANGED)
            if self.ol_image is not None and allFaces[i][0]>-1:
                frame = common.overlayOnPart(frame, self.ol_image, allFaces[i][0], allFaces[i][1], allFaces[i][3])

            out.write(frame)
            if i%50 == 0: 
                print("現在のフレーム:"+str(i))
        
        out.release()
예제 #2
0
    def set(self):

        # 画像領域をクリア
        self.scene.clear()

        # 現在のフレームの位置をセットする
        self.movie.set(cv2.CAP_PROP_POS_FRAMES,self.nowFrame)
        ret, movieFrame = self.movie.read()
        if ret == False:
            return

        # オーバレイ画像が選択されていて、読み込み成功していればオーバレイ
        ol_imgae_path = self.faces[int(self.nowFrame/self.REDUCT_RATE)][2]
        ol_image = cv2.imread(ol_imgae_path,cv2.IMREAD_UNCHANGED)
        if ol_image is not None and self.faces[int(self.nowFrame/self.REDUCT_RATE)][0]>-1:
            movieFrame = common.overlayOnPart(movieFrame, ol_image, self.faces[int(self.nowFrame/self.REDUCT_RATE)][0], self.faces[int(self.nowFrame/self.REDUCT_RATE)][1], self.faces[int(self.nowFrame/self.REDUCT_RATE)][3])

        movieFrame = cv2.cvtColor(movieFrame,cv2.COLOR_BGR2RGB)
        height, width, dim = movieFrame.shape
        bytesPerLine = dim * width
        self.image = QtGui.QImage(movieFrame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
        self.item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap.fromImage(self.image))
        self.scene.addItem(self.item)

        # 顔の位置を選択してあれば赤丸を表示 端には丸を表示しない
        if self.faces[int(self.nowFrame/self.REDUCT_RATE)][0] > self.RADIUS/2 and self.faces[int(self.nowFrame/self.REDUCT_RATE)][1] > self.RADIUS/2:
            circleItem = QtGui.QGraphicsEllipseItem(self.faces[int(self.nowFrame/self.REDUCT_RATE)][0]-self.RADIUS/2, self.faces[int(self.nowFrame/self.REDUCT_RATE)][1]-self.RADIUS/2, self.RADIUS, self.RADIUS)
            circleItem.setPen(QtGui.QPen(QtCore.Qt.black, 1))
            circleItem.setBrush(QtGui.QBrush(QtCore.Qt.red))
            self.scene.addItem(circleItem)
        
        self.ui.graphicsView.installEventFilter(self)
        self.ui.graphicsView.setScene(self.scene)

        # 現在フレームを表示する文字列の作成、表示。
        viewtxt = ''
        viewtxt = viewtxt + '現在のフレーム: '
        viewtxt = viewtxt + str(self.nowFrame)
        viewtxt = viewtxt + ' / '
        viewtxt = viewtxt + str(self.movie.get(cv2.CAP_PROP_FRAME_COUNT))
        viewtxt = viewtxt + '   '
        viewtxt = viewtxt +str(self.faces[int(self.nowFrame/self.REDUCT_RATE)][0])
        viewtxt = viewtxt + ', '
        viewtxt = viewtxt +str(self.faces[int(self.nowFrame/self.REDUCT_RATE)][1])
        viewtxt = viewtxt + ')'
        self.ui.framePosEdit.setText(viewtxt)
        
        self.ui.picNameEdit.setText(self.faces[int(self.nowFrame/self.REDUCT_RATE)][2])
        self.ui.zoomRateEdit.setText(str(self.faces[int(self.nowFrame/self.REDUCT_RATE)][3]))