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()
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]))