(七)视频背景移除/去背景/换背景/抠图/抠像代码示例:实时抠图、实时抠像、人像去背景、背景消除
視頻背景移除/去背景/換背景/摳圖/摳像代碼示例:實時摳圖、實時摳像、人像去背景、背景消除
本文與前幾篇博文關(guān)聯(lián)性較強,請事先閱讀前幾篇。 對此文感興趣的可以加微深入探討:herbert156
軟件打包上傳了百度網(wǎng)盤:
【視頻背景移除】鏈接: https://pan.baidu.com/s/1Dhr7MHkGd8vlXfyETrK3xQ 提取碼: 29n2
【圖像背景移除】鏈接: https://pan.baidu.com/s/1nhuWMYWvTV3B0d0CdGDhFQ 提取碼: q46x
【攝像頭背景移除】鏈接: https://pan.baidu.com/s/1tx88C3dCH3ej3PJcKLDmdQ 提取碼: g7xy
軟件界面如下:
一、視頻摳像
以下的Python代碼的功能:視頻背景移除、去背景、人像摳圖、換背景等,主要功能包括:
1、對包含人像的視頻進行摳像,并替換背景(可以替換成純色的、也可以替換成指定背景圖片);
2、可以批量處理,在選擇文件的對話框里可以選擇多個文件,同時摳像換背景、批量操作;
3、軟件設置里可以設置使用GPU處理還是CPU處理,軟件只支持英偉達(Nvidia)的GTX/RTX系列的GPU;
4、摳圖算法的模型有復雜模型和簡易模型,可以根據(jù)原始圖片的背景復雜度隨意選擇;
5、信息統(tǒng)計里面可以實時顯示處理的各種統(tǒng)計信息;
6、視頻處理完畢后自動進行音頻的處理與合成。
二、視頻摳圖代碼
將視頻文件逐幀解出,然后逐幀摳圖。再按照原來FPS合成視頻、音頻:
三、界面操作代碼
def show_error(self,str):r_button = QMessageBox.question(self, my_title,'\n\n'+str+'\n\n', QMessageBox.Ok)def set_False_Btn(self):self.filesButton.setEnabled(False); self.outButton.setEnabled(False)self.bkfileButton.setEnabled(False); self.checkBox3.setEnabled(False)self.startButton.setEnabled(False); self.stopButton.setEnabled(True)self.quitButton.setEnabled(False)def set_True_Btn(self):self.filesButton.setEnabled(True); self.outButton.setEnabled(True)self.bkfileButton.setEnabled(True); self.checkBox3.setEnabled(True)self.startButton.setEnabled(True); self.stopButton.setEnabled(False)self.quitButton.setEnabled(True)def startrun(self):global iii,stop_flag,t0iii = 0; stop_flag = Falseself.txt12.setText('【運行信息】 正在初始化AI模型......');cv2.waitKey(1)t0 = time.time()if files == []: self.show_error('請選擇需要替換背景的視頻文件!'); returnif not os.path.exists(out_dir): self.show_error('輸出目錄不存在,請重新選擇!'); returnself.set_False_Btn()if not Box3_flag:#try: back_ground = cv2.imread(bg_file) # 讀取背景文件try: back_ground = cv2.imdecode(np.fromfile(bg_file, dtype=np.uint8), -1)except: self.show_error('讀取背景文件時,出現(xiàn)錯誤!'); self.set_True_Btn(); returnif back_ground is None: self.show_error('讀取背景文件時,出現(xiàn)錯誤!\n原因:目錄/文件名不能包含中文...... '); self.set_True_Btn(); returnelse: back_ground = bk_imgfor file in files:iii += 1if stop_flag: breakself.video_change_background(file, back_ground)self.set_True_Btn()self.my_label1.setPixmap(QPixmap("start_img.jpg"))self.my_label2.setPixmap(QPixmap("start_img.jpg"))def stoprun(self):global stop_flagr_button = QMessageBox.question(self, my_title,"\n\n 確定要停止替換背景嗎?\n\n", QMessageBox.Yes | QMessageBox.No)if r_button == QMessageBox.Yes: stop_flag = Truedef helpWin(self):str="\n\n\n1、【選擇文件】選擇需要替換背景的視頻文件;\n2、【輸出目錄】替換后的文件目錄,文件名:源文件_1.mp4;\n"+\"3、【背景文件】選擇后,人物視頻的背景都被替換成此背景;\n4、【純色背景】點選后,所有視頻背景替換成純色的;\n"+\"5、如沒有Nvidia系列GPU,就選CPU處理,AI需選【簡易】;\n6、AI摳像算法有簡易、復雜2種,可在軟件設置欄目里面選擇;\n\n\n"+\" 本軟件著作權(quán)歸屬:??? 網(wǎng)址:www.???.com\n\n"QMessageBox.question(self, my_title, str, QMessageBox.Ok)def quitWin(self):r_button = QMessageBox.question(self, my_title,"\n\n 退出將終止替換進程\n\n 確認退出嗎?\n\n", QMessageBox.Yes | QMessageBox.No)if r_button == QMessageBox.Yes: sys.exit()def filesButton_fuc(self):global files,filesnumsfiles, ok1 = QFileDialog.getOpenFileNames(self,'請選擇視頻文件[全選:Ctrl+A、多選:Ctrl/Shift+鼠標]',input_path,"*.mp4;;*.avi;;*.mkv")filesnums = len(files)if files!=[]:txt='目錄:'+os.path.split(files[0])[0]+' | 已選文件:'+str(filesnums)+'個 | 文件名:'for file in files: txt=txt+ os.path.split(file)[1]+'; 'self.txt1.setText(txt)else: self.txt1.setText('請選擇視頻文件[全選:Ctrl+A、多選:Ctrl/Shift+鼠標]......')def outButton_fuc(self):global out_dirout_dir = QFileDialog.getExistingDirectory(self,'選擇轉(zhuǎn)換后的輸出文件夾', work_path)if out_dir == '': self.txt2.setText('請選擇背景替換后文件保存目錄......')else: self.txt2.setText(out_dir)def bkfileButton_fuc(self):global bg_filebg_file, ok1 = QFileDialog.getOpenFileName(self,"選擇背景圖片文件",work_path,"*.jpg;;*.png;;*.gif")if bg_file == '': self.txt3.setText('請選擇背景圖片文件......')else: self.txt3.setText(bg_file)def click_comboBox1(self, text):global if_use_gpu,if_good_modelif text == 'GPU':if GPU_memsize < 3 and self.comboBox2.currentIndex() == 1:self.show_error("\nGPU名稱:%s\nGPU內(nèi)存:%dG\n\n注意:\nGPU內(nèi)存必須大于3G才能進行復雜AI模型,\n請選擇簡易模型!"%(GPU_name,GPU_memsize))self.comboBox2.setCurrentIndex(0);if_good_model = Falseif_use_gpu = Trueelse: if_use_gpu = Falsedef click_comboBox2(self, text):global if_good_model,if_use_gpuif text == '復雜':if GPU_memsize < 3 and self.comboBox1.currentIndex() == 1:self.show_error("\nGPU名稱:%s\nGPU內(nèi)存:%dG\n\n注意:\nGPU內(nèi)存必須大于3G才能進行復雜AI模型,\n請選擇簡易模型或CPU處理!"% (GPU_name, GPU_memsize))self.comboBox1.setCurrentIndex(0);if_use_gpu = Falseif_good_model = Trueelse: if_good_model = Falsedef box_choose(self):global Box1_flag, Box2_flagif self.checkBox1.isChecked(): Box1_flag = Trueelse:Box1_flag = False; self.my_label1.setPixmap(QPixmap("start_img.jpg"))if self.checkBox2.isChecked(): Box2_flag = Trueelse:Box2_flag = False; self.my_label2.setPixmap(QPixmap("start_img.jpg"))def box_choose3(self):global Box3_flagif self.checkBox3.isChecked():self.txt3.setEnabled(False); self.bkfileButton.setEnabled(False)self.txt3.setText('已經(jīng)選擇純色背景......')self.set_rgb_True()Box3_flag = Trueelse:self.txt3.setEnabled(True); self.bkfileButton.setEnabled(True)self.txt3.setText(bg_file)self.set_rgb_False()Box3_flag = Falsedef set_rgb_False(self):self.red.setEnabled(False); self.red_e.setEnabled(False); self.green.setEnabled(False)self.green_e.setEnabled(False); self.blue.setEnabled(False); self.blue_e.setEnabled(False)def set_rgb_True(self):self.red.setEnabled(True); self.red_e.setEnabled(True); self.green.setEnabled(True)self.green_e.setEnabled(True); self.blue.setEnabled(True); self.blue_e.setEnabled(True)四、界面布局代碼
def createLayout(self):mainLayout = QtWidgets.QVBoxLayout();topLayout1 = QtWidgets.QHBoxLayout();topLayout2 = QtWidgets.QHBoxLayout()topLayout3 = QtWidgets.QHBoxLayout();topLayout4 = QtWidgets.QHBoxLayout()self.my_label1 = QtWidgets.QLabel(); self.my_label2 = QtWidgets.QLabel()topLayout1.addWidget(self.my_label1); topLayout1.addWidget(self.my_label2)self.my_label1.setPixmap(QPixmap("start_img.jpg")); self.my_label2.setPixmap(QPixmap("start_img.jpg"))self.my_label1.setFixedSize(427, 240); self.my_label2.setFixedSize(427, 240)self.my_label1.setAlignment(Qt.AlignCenter); self.my_label2.setAlignment(Qt.AlignCenter)self.my_label1.setToolTip("本區(qū)域,顯示的是原始視頻縮略圖..."); self.my_label2.setToolTip("本區(qū)域,顯示的是替換后的縮略圖...")self.GroupBox1 = QtWidgets.QGroupBox("軟件設置")self.GroupBox1.setFixedSize(280, 60)self.lbl_1 = QtWidgets.QLabel("處理器:", self)self.lbl_1.setFixedSize(45, 25)self.comboBox1 = QtWidgets.QComboBox(self)self.comboBox1.setFixedSize(50, 25)self.comboBox1.addItem("CPU"); self.comboBox1.addItem("GPU")if if_use_gpu: self.comboBox1.setCurrentIndex(1)else: self.comboBox1.setEnabled(False)self.comboBox1.activated[str].connect(self.click_comboBox1)self.lbl_2 = QtWidgets.QLabel("AI算法:", self)self.lbl_2.setFixedSize(45, 25)self.comboBox2 = QtWidgets.QComboBox(self)self.comboBox2.setFixedSize(50, 25)self.comboBox2.addItem("簡易"); self.comboBox2.addItem("復雜")if if_good_model:self.comboBox2.setCurrentIndex(1)self.comboBox2.activated[str].connect(self.click_comboBox2)GroupBox1Layout = QtWidgets.QHBoxLayout()GroupBox1Layout.addWidget(self.lbl_2)GroupBox1Layout.addWidget(self.comboBox2)GroupBox1Layout.addWidget(self.lbl_1)GroupBox1Layout.addWidget(self.comboBox1)self.GroupBox1.setLayout(GroupBox1Layout)#if not if_use_gpu: self.GroupBox1.setEnabled(False)self.GroupBox2 = QtWidgets.QGroupBox("預覽設置")self.GroupBox2.setFixedSize(180, 60)self.checkBox1 = QtWidgets.QCheckBox("原始視頻")self.checkBox2 = QtWidgets.QCheckBox("輸出視頻")GroupBox2Layout = QtWidgets.QHBoxLayout()GroupBox2Layout.addWidget(self.checkBox1)GroupBox2Layout.addWidget(self.checkBox2)self.GroupBox2.setLayout(GroupBox2Layout)self.checkBox1.stateChanged.connect(self.box_choose)self.checkBox2.stateChanged.connect(self.box_choose)self.checkBox1.setChecked(True); self.checkBox2.setChecked(True)self.GroupBox4 = QtWidgets.QGroupBox("文件設置")self.GroupBox4.setFixedSize(850, 160)self.filesButton = self.createButton("選擇文件", self.filesButton_fuc)self.outButton = self.createButton("輸出目錄", self.outButton_fuc)self.bkfileButton = self.createButton("背景文件", self.bkfileButton_fuc)self.filesButton.setToolTip("選擇即將被替換背景的視頻文件,可單選、多選...")self.outButton.setToolTip("選擇輸出文件目錄,替換后的文件將存在此目錄...")self.bkfileButton.setToolTip("選擇可用作背景的圖片文件,建議分辨率:1920x1080...")self.filesButton.setFixedSize(80,23); self.outButton.setFixedSize(80,23)self.bkfileButton.setFixedSize(80,23)self.txt1 = QLabel('請選擇視頻文件[Ctrl+A全選、Ctrl/Shift+鼠標可多選]......', self); self.txt2 = QLabel('輸出目錄', self)self.txt3 = QLabel('背景文件', self); self.txt4 = QLabel('純色文件', self)self.txt2.setText(out_dir); self.txt3.setText(bg_file);self.txt4.setPixmap(self.CvMatToQImage(cv2.resize(bk_img, (50, 18))))self.checkBox3 = QtWidgets.QCheckBox("純色背景")self.checkBox3.stateChanged.connect(self.box_choose3)self.red = QLabel(' 紅', self); self.green= QLabel(' 綠', self); self.blue = QLabel(' 藍', self)self.red_e = QLineEdit(self); self.red_e.setText('8')self.green_e = QLineEdit(self); self.green_e.setText('188')self.blue_e = QLineEdit(self); self.blue_e.setText('8')self.red_e.setValidator(QIntValidator(0, 254))self.green_e.setValidator(QIntValidator(0, 254))self.blue_e.setValidator(QIntValidator(0, 254))self.red_e.setFixedSize(28, 20);self.green_e.setFixedSize(28, 20);self.blue_e.setFixedSize(28, 20)self.red_e.textChanged[str].connect(self.red_e_fuc)self.green_e.textChanged[str].connect(self.green_e_fuc)self.blue_e.textChanged[str].connect(self.blue_e_fuc)layout_box1 = QtWidgets.QHBoxLayout()layout_box2 = QtWidgets.QHBoxLayout()layout_box3 = QtWidgets.QHBoxLayout()layout_box1.addWidget(self.filesButton, Qt.AlignLeft| Qt.AlignVCenter)layout_box1.addWidget(self.txt1, Qt.AlignLeft| Qt.AlignVCenter)layout_box2.addWidget(self.outButton)layout_box2.addWidget(self.txt2)layout_box2.addWidget(self.bkfileButton)layout_box2.addWidget(self.txt3)layout_box3.addWidget(self.checkBox3)layout_box3.addWidget(self.txt4)layout_box3.addWidget(self.red)layout_box3.addWidget(self.red_e)layout_box3.addWidget(self.green)layout_box3.addWidget(self.green_e)layout_box3.addWidget(self.blue)layout_box3.addWidget(self.blue_e)layout_box3.addStretch(1)layout11 = QWidget(); layout21 = QWidget(); layout31 = QWidget()layout11.setLayout(layout_box1); layout21.setLayout(layout_box2); layout31.setLayout(layout_box3)GroupBoxmainLayout = QtWidgets.QVBoxLayout()GroupBoxmainLayout.addWidget(layout11, Qt.AlignLeft | Qt.AlignVCenter)GroupBoxmainLayout.addWidget(layout21, Qt.AlignLeft | Qt.AlignVCenter)GroupBoxmainLayout.addWidget(layout31, Qt.AlignLeft | Qt.AlignVCenter)self.GroupBox4.setLayout(GroupBoxmainLayout)self.GroupBox5 = QtWidgets.QGroupBox("信息統(tǒng)計")self.GroupBox5.setFixedSize(850, 90)self.txt11 = QLabel('【視頻信息】', self)self.txt12 = QLabel('【運行信息】', self)GroupBox5Layout = QtWidgets.QGridLayout()GroupBox5Layout.addWidget(self.txt11, 0, 1)GroupBox5Layout.addWidget(self.txt12, 1, 1)self.GroupBox5.setLayout(GroupBox5Layout)self.startButton = self.createButton("開始處理", self.startrun)self.stopButton = self.createButton("停止", self.stoprun)self.helpButton = self.createButton("幫助", self.helpWin)self.quitButton = self.createButton("退出", self.quitWin)self.startButton.setFixedSize(80,25)self.stopButton.setFixedSize(55, 25)self.helpButton.setFixedSize(55,25)self.quitButton.setFixedSize(55,25)topLayout2.addWidget(self.GroupBox4)topLayout3.addWidget(self.GroupBox5)topLayout4.addWidget(self.GroupBox1)topLayout4.addWidget(self.GroupBox2)topLayout4.addWidget(self.startButton)topLayout4.addWidget(self.stopButton)topLayout4.addWidget(self.helpButton)topLayout4.addWidget(self.quitButton)topLayout4.setSpacing(20)layout1 = QWidget(); layout2 = QWidget()layout3 = QWidget(); layout4 = QWidget()layout1.setLayout(topLayout1); layout2.setLayout(topLayout2)layout3.setLayout(topLayout3); layout4.setLayout(topLayout4)mainLayout.addWidget(layout1, Qt.AlignLeft | Qt.AlignTop)mainLayout.addWidget(layout2, Qt.AlignLeft | Qt.AlignBottom)mainLayout.addWidget(layout3, Qt.AlignLeft | Qt.AlignBottom)mainLayout.addWidget(layout4, Qt.AlignLeft | Qt.AlignBottom)self.setLayout(mainLayout)def createButton(self, text, member):button = QtWidgets.QPushButton(text)button.clicked.connect(member)return button```總結(jié)
以上是生活随笔為你收集整理的(七)视频背景移除/去背景/换背景/抠图/抠像代码示例:实时抠图、实时抠像、人像去背景、背景消除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊人像抠图背后的算法技术
- 下一篇: 弹窗php整人_[整人小程序] 超级信息