mirror of
https://github.com/iperov/DeepFaceLive
synced 2025-07-10 15:23:33 -07:00
Stream output module: added 2 modes that show source frame if merged frame does not exist
This commit is contained in:
parent
242ec9f06c
commit
05fe7e82dd
3 changed files with 46 additions and 22 deletions
|
@ -193,7 +193,7 @@ class FaceMarkerWorker(BackendWorker):
|
|||
fsi.face_ulmrks = face_ulmrks
|
||||
|
||||
self.stop_profile_timing()
|
||||
self.pending_bcd = bcd
|
||||
self.pending_bcd = bcd
|
||||
|
||||
if self.pending_bcd is not None:
|
||||
if self.bc_out.is_full_read(1):
|
||||
|
|
|
@ -39,10 +39,18 @@ class SourceType(IntEnum):
|
|||
ALIGNED_FACE = 1
|
||||
SWAPPED_FACE = 2
|
||||
MERGED_FRAME = 3
|
||||
SOURCE_N_MERGED_FRAME = 4
|
||||
MERGED_FRAME_OR_SOURCE_FRAME = 4
|
||||
SOURCE_N_MERGED_FRAME = 5
|
||||
SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME = 6
|
||||
|
||||
ViewModeNames = ['@StreamOutput.SourceType.SOURCE_FRAME', '@StreamOutput.SourceType.ALIGNED_FACE', '@StreamOutput.SourceType.SWAPPED_FACE',
|
||||
'@StreamOutput.SourceType.MERGED_FRAME', '@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME']
|
||||
ViewModeNames = ['@StreamOutput.SourceType.SOURCE_FRAME',
|
||||
'@StreamOutput.SourceType.ALIGNED_FACE',
|
||||
'@StreamOutput.SourceType.SWAPPED_FACE',
|
||||
'@StreamOutput.SourceType.MERGED_FRAME',
|
||||
'@StreamOutput.SourceType.MERGED_FRAME_OR_SOURCE_FRAME',
|
||||
'@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME',
|
||||
'@StreamOutput.SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME',
|
||||
]
|
||||
|
||||
|
||||
class StreamOutputWorker(BackendWorker):
|
||||
|
@ -70,7 +78,7 @@ class StreamOutputWorker(BackendWorker):
|
|||
|
||||
state, cs = self.get_state(), self.get_control_sheet()
|
||||
|
||||
cs.source_type.call_on_selected(self.on_cs_mode)
|
||||
cs.source_type.call_on_selected(self.on_cs_source_type)
|
||||
cs.show_hide_window.call_on_signal(self.on_cs_show_hide_window_signal)
|
||||
cs.aligned_face_id.call_on_number(self.on_cs_aligned_face_id)
|
||||
cs.target_delay.call_on_number(self.on_cs_target_delay)
|
||||
|
@ -109,7 +117,7 @@ class StreamOutputWorker(BackendWorker):
|
|||
|
||||
|
||||
|
||||
def on_cs_mode(self, idx, source_type):
|
||||
def on_cs_source_type(self, idx, source_type):
|
||||
state, cs = self.get_state(), self.get_control_sheet()
|
||||
if source_type == SourceType.ALIGNED_FACE:
|
||||
cs.aligned_face_id.enable()
|
||||
|
@ -117,11 +125,11 @@ class StreamOutputWorker(BackendWorker):
|
|||
cs.aligned_face_id.set_number(state.aligned_face_id or 0)
|
||||
else:
|
||||
cs.aligned_face_id.disable()
|
||||
|
||||
state.source_type = source_type
|
||||
|
||||
self.save_state()
|
||||
self.reemit_frame_signal.send()
|
||||
|
||||
|
||||
def show_window(self):
|
||||
state, cs = self.get_state(), self.get_control_sheet()
|
||||
cv2.namedWindow(self._wnd_name)
|
||||
|
@ -203,8 +211,10 @@ class StreamOutputWorker(BackendWorker):
|
|||
|
||||
if source_type == SourceType.SOURCE_FRAME:
|
||||
view_image = bcd.get_image(bcd.get_frame_image_name())
|
||||
elif source_type == SourceType.MERGED_FRAME:
|
||||
elif source_type in [SourceType.MERGED_FRAME, SourceType.MERGED_FRAME_OR_SOURCE_FRAME]:
|
||||
view_image = bcd.get_image(bcd.get_merged_image_name())
|
||||
if view_image is None and source_type == SourceType.MERGED_FRAME_OR_SOURCE_FRAME:
|
||||
view_image = bcd.get_image(bcd.get_frame_image_name())
|
||||
|
||||
elif source_type == SourceType.ALIGNED_FACE:
|
||||
aligned_face_id = state.aligned_face_id
|
||||
|
@ -218,15 +228,20 @@ class StreamOutputWorker(BackendWorker):
|
|||
view_image = bcd.get_image(fsi.face_swap_image_name)
|
||||
if view_image is not None:
|
||||
break
|
||||
|
||||
elif source_type == SourceType.SOURCE_N_MERGED_FRAME:
|
||||
|
||||
elif source_type in [SourceType.SOURCE_N_MERGED_FRAME, SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME]:
|
||||
source_frame = bcd.get_image(bcd.get_frame_image_name())
|
||||
merged_frame = bcd.get_image(bcd.get_merged_image_name())
|
||||
if source_frame is not None and merged_frame is not None:
|
||||
if source_frame is not None:
|
||||
source_frame = ImageProcessor(source_frame).to_ufloat32().get_image('HWC')
|
||||
|
||||
merged_frame = bcd.get_image(bcd.get_merged_image_name())
|
||||
|
||||
if merged_frame is None and source_type == SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME:
|
||||
merged_frame = source_frame
|
||||
|
||||
if source_frame is not None and merged_frame is not None:
|
||||
view_image = np.concatenate( (source_frame, merged_frame), 1 )
|
||||
|
||||
|
||||
if view_image is not None:
|
||||
buffered_frames.add_buffer( bcd.get_frame_timestamp(), view_image )
|
||||
|
||||
|
|
|
@ -336,7 +336,7 @@ class Localization:
|
|||
'en-US' : 'Increase stabilization by excluding landmarks of moving parts of the face, such as mouth and other.',
|
||||
'ru-RU' : 'Улучшить стабилизацию исключением лицевых точек\nдвижущихся частей лица, таких как рот и других.',
|
||||
'zh-CN' : '通过排除面部移动部分(例如嘴巴和其他你懂的)的特征点来提高稳定性。'},
|
||||
|
||||
|
||||
'QFaceAligner.head_mode':{
|
||||
'en-US' : 'Head mode',
|
||||
'ru-RU' : 'Режим головы',
|
||||
|
@ -536,7 +536,7 @@ class Localization:
|
|||
'en-US' : 'Face mask type',
|
||||
'ru-RU' : 'Тип маски лица',
|
||||
'zh-CN' : '人脸遮罩类型'},
|
||||
|
||||
|
||||
'QFaceMerger.face_mask_erode':{
|
||||
'en-US' : 'Face mask erode',
|
||||
'ru-RU' : 'Укорочение маски',
|
||||
|
@ -546,17 +546,17 @@ class Localization:
|
|||
'en-US' : 'Face mask blur',
|
||||
'ru-RU' : 'Размытие маски',
|
||||
'zh-CN' : '遮罩边缘羽化'},
|
||||
|
||||
|
||||
'QFaceMerger.help.color_transfer':{
|
||||
'en-US' : 'Match the color distribution of the replaced face to the original face.',
|
||||
'ru-RU' : 'Совместить цветовое распределение заменённого лица с исходным.',
|
||||
'zh-CN' : '将被替换的面孔的颜色分布与原始面孔相匹配。'},
|
||||
|
||||
|
||||
'QFaceMerger.color_transfer':{
|
||||
'en-US' : 'Color transfer',
|
||||
'ru-RU' : 'Перенос цвета',
|
||||
'zh-CN' : '彩色转印'},
|
||||
|
||||
|
||||
'QFaceMerger.interpolation':{
|
||||
'en-US' : 'Interpolation',
|
||||
'ru-RU' : 'Интерполяция',
|
||||
|
@ -566,7 +566,7 @@ class Localization:
|
|||
'en-US' : 'Color compression',
|
||||
'ru-RU' : 'Сжатие цвета',
|
||||
'zh-CN' : '颜色压缩'},
|
||||
|
||||
|
||||
'QFaceMerger.face_opacity':{
|
||||
'en-US' : 'Face opacity',
|
||||
'ru-RU' : 'Непрозрач. лица',
|
||||
|
@ -696,7 +696,7 @@ class Localization:
|
|||
'en-US' : 'Downloading model...',
|
||||
'ru-RU' : 'Загрузка модели...',
|
||||
'zh-CN' : '下载模型中...'},
|
||||
|
||||
|
||||
'StreamOutput.SourceType.SOURCE_FRAME':{
|
||||
'en-US' : 'Source frame',
|
||||
'ru-RU' : 'Исходный кадр',
|
||||
|
@ -717,9 +717,18 @@ class Localization:
|
|||
'ru-RU' : 'Склеенный кадр',
|
||||
'zh-CN' : '合成后的画面'},
|
||||
|
||||
'StreamOutput.SourceType.MERGED_FRAME_OR_SOURCE_FRAME':{
|
||||
'en-US' : 'Merged frame or source frame',
|
||||
'ru-RU' : 'Склеенный кадр или исходный кадр',
|
||||
'zh-CN' : '合成后的画面否则源帧'},
|
||||
|
||||
'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME':{
|
||||
'en-US' : 'Source and merged frame',
|
||||
'ru-RU' : 'Исходный и склеенный кадр',
|
||||
'zh-CN' : '源和融合后的帧'},
|
||||
|
||||
|
||||
'StreamOutput.SourceType.SOURCE_N_MERGED_FRAME_OR_SOURCE_FRAME':{
|
||||
'en-US' : 'Source and merged frame or source frame',
|
||||
'ru-RU' : 'Исходный и склеенный кадр или исходный кадр',
|
||||
'zh-CN' : '源和融合后的帧则源帧'},
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue