Refactor cam settings, add key bindings for wb, exp, flip image
This commit is contained in:
parent
3d13bd8905
commit
b9a9f32e89
15
config.toml
15
config.toml
|
@ -1,6 +1,5 @@
|
|||
[DEFAULT]
|
||||
#camera_type = 2
|
||||
cam_is_showmewebcam = false
|
||||
cam_is_showmewebcam = true
|
||||
use_date_for_folder = false
|
||||
file_extension = 'png'
|
||||
projects_folder = ''
|
||||
|
@ -10,9 +9,13 @@ fullscreen_bool = true
|
|||
screen_w = 1920
|
||||
screen_h = 1080
|
||||
framerate = 16
|
||||
vflip = false
|
||||
hflip = false
|
||||
ffmpeg_path = '/usr/bin/ffmpeg'
|
||||
export_options = 'scale=1920:-1,crop=1920:1080:0:102'
|
||||
export_options = 'scale=1920:-1,crop=1920:1080'
|
||||
[CAMERA]
|
||||
|
||||
cam_w = 1920
|
||||
cam_h = 1080
|
||||
vflip = 1
|
||||
hflip = 1
|
||||
auto_exposure = 0
|
||||
white_balance_auto_preset = 0
|
||||
video_bitrate=25000000
|
||||
|
|
186
frame_opencv.py
186
frame_opencv.py
|
@ -25,30 +25,34 @@ _ = gettext.translation('template', localedir='locales', languages=[LOCALE]).get
|
|||
# Config
|
||||
# defaults
|
||||
project_settings_defaults = {
|
||||
# gphoto2 = 0, picam = 1, webcam = 2
|
||||
'camera_type': 2,
|
||||
'file_extension':'JPG',
|
||||
'trigger_mode': 'key',
|
||||
'projects_folder': '',
|
||||
'cam_is_showmewebcam': False,
|
||||
'use_date_for_folder': False,
|
||||
'file_extension':'png',
|
||||
'projects_folder': '',
|
||||
'onion_skin_onstartup' : False,
|
||||
'onionskin_alpha_default' : 0.4,
|
||||
'onionskin_fx' : False,
|
||||
'fullscreen_bool' : True,
|
||||
'screen_w' : 1920,
|
||||
'screen_h' : 1080,
|
||||
'framerate' : 16,
|
||||
'vflip' : False,
|
||||
'hflip' : False,
|
||||
'ffmpeg_path' : None,
|
||||
'export_options' : 'scale=1920:-1,crop=1920:1080:0:102',
|
||||
'cache_images' : False,
|
||||
'liveview' : False,
|
||||
}
|
||||
|
||||
camera_current_settings_defaults = {
|
||||
'cam_w' : 800,
|
||||
'cam_h' : 600,
|
||||
'vflip' : 0,
|
||||
'hflip' : 0,
|
||||
'auto_exposure' : 0,
|
||||
'white_balance_auto_preset' : 0,
|
||||
}
|
||||
|
||||
# Load from file
|
||||
config_locations = ["./", "~/.", "~/.config/"]
|
||||
config_found_msg = _("No configuration file found, using defaults.")
|
||||
project_settings = project_settings_defaults
|
||||
camera_current_settings = camera_current_settings_defaults
|
||||
for location in config_locations:
|
||||
# Optional config files, ~ is expanded to $HOME on *nix, %USERPROFILE% on windows
|
||||
if os.path.exists( os.path.expanduser(os.path.join(location, 'config.toml'))):
|
||||
|
@ -61,13 +65,45 @@ for location in config_locations:
|
|||
config_found_msg = _("Found configuration file in {}").format(os.path.expanduser(location))
|
||||
print(config_found_msg)
|
||||
|
||||
def reset_wb_exp():
|
||||
# Flip auto-exposure, white-balance on to adapt to light environment
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c auto_exposure=0 -c white_balance_auto_preset=1')
|
||||
# Give some time to the captor to adapt
|
||||
time.sleep(1)
|
||||
# Flip back, wb 3 = fluorescent
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c auto_exposure=1 -c white_balance_auto_preset=2')
|
||||
camera_current_settings = {
|
||||
'auto_exposure': dict(min=0, max=1, default=camera_settings['auto_exposure'], value=camera_settings['auto_exposure']),
|
||||
'white_balance_auto_preset': dict(min=0, max=9, default=camera_settings['white_balance_auto_preset'], value=camera_settings['white_balance_auto_preset']),
|
||||
'horizontal_flip': dict(min=0, max=1, default=camera_settings['hflip'], value=camera_settings['hflip']),
|
||||
'vertical_flip': dict(min=0, max=1, default=camera_settings['vflip'], value=camera_settings['vflip']),
|
||||
'video_bitrate': dict(min=25000000, max=25000000, default=camera_settings['video_bitrate'], value=camera_settings['video_bitrate']),
|
||||
}
|
||||
|
||||
|
||||
def apply_cam_setting(cam_settings:dict, to_set:list=None):
|
||||
cmd = 'v4l2-ctl -d /dev/video0'
|
||||
args = []
|
||||
for setting in cam_settings:
|
||||
if to_set is None:
|
||||
# Apply defaults
|
||||
cam_settings[setting]['value'] = cam_settings[setting]['default']
|
||||
cmd += ' -c {}={}'
|
||||
args.append(setting)
|
||||
args.append(cam_settings[setting]['value'])
|
||||
else:
|
||||
# Increment settings in to_set
|
||||
for setting in to_set:
|
||||
if setting in cam_settings:
|
||||
if cam_settings[setting]['value']+1 in range(cam_settings[setting]['min'],cam_settings[setting]['max']+1):
|
||||
cam_settings[setting]['value'] += 1
|
||||
else:
|
||||
cam_settings[setting]['value'] = cam_settings[setting]['min']
|
||||
cmd += ' -c {}={}'
|
||||
args.append(setting)
|
||||
args.append(cam_settings[setting]['value'])
|
||||
else:
|
||||
print(_("Unknown setting!"))
|
||||
break
|
||||
if project_settings['cam_is_showmewebcam']:
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), cmd.format(*args))
|
||||
else:
|
||||
# TODO: v4l2 support
|
||||
print(_("Camera function not supported."))
|
||||
return cam_settings
|
||||
|
||||
|
||||
def generate_text_image(text:str, screen_w, screen_h, bullets=False):
|
||||
|
@ -75,8 +111,6 @@ def generate_text_image(text:str, screen_w, screen_h, bullets=False):
|
|||
(screen_w, screen_h),
|
||||
(0,0,0)
|
||||
)
|
||||
# ~ text_image = np.zeros((screen_h,screen_w,3),np.uint8)
|
||||
# ~ text_image_pil = Image.fromarray(text_image)
|
||||
text_image_draw = ImageDraw.Draw(text_image)
|
||||
if text is not None:
|
||||
font = ImageFont.truetype("Tuffy_Bold.ttf", (screen_w/32))
|
||||
|
@ -251,8 +285,6 @@ def get_onionskin_frame(folder:str, index=None):
|
|||
def return_next_frame_number(last_frame_name):
|
||||
prefix, filecount, ext = last_frame_name
|
||||
filename = '.{:04d}.'.format(int(filecount)+1)
|
||||
# ~ filename = (".%04i." % x for x in count(int(filecount) + 1))
|
||||
# ~ return prefix + next(filename) + ext
|
||||
return prefix + filename + ext
|
||||
|
||||
|
||||
|
@ -316,13 +348,9 @@ def batch_rename(folder:str):
|
|||
# initialize counter to 0
|
||||
frame_list = get_frames_list(folder)
|
||||
counter = (".%04i." % x for x in count(0))
|
||||
# ~ for i in range(len(frame_list)):
|
||||
for i in frame_list:
|
||||
# ~ if os.path.exists(os.path.realpath(frame_list[i])):
|
||||
if os.path.exists(os.path.join(folder, i)):
|
||||
# ~ os.rename(os.path.realpath(frame_list[i]), os.path.realpath("{}{}{}".format(project_settings['project_letter'], next(counter), project_settings['file_extension'])))
|
||||
os.rename(os.path.join(folder, i), os.path.join(folder, "{}{}{}".format(project_letter, next(counter), project_settings['file_extension'])))
|
||||
# ~ print(os.path.join(folder, "{}{}{}".format(project_letter, next(counter), project_settings['file_extension'])))
|
||||
else:
|
||||
print(_("{} does not exist").format(str(i)))
|
||||
return get_frames_list(folder)
|
||||
|
@ -350,8 +378,6 @@ def remove_frame(img_list, img_index):
|
|||
send2trash(frame_path)
|
||||
# remove entry from dict
|
||||
img_list.remove(frame_name)
|
||||
# offset cached images
|
||||
# ~ offset_dictvalues(img_index)
|
||||
# rename files and get new list
|
||||
img_list = batch_rename(folder_path)
|
||||
clean_img_list(folder_path)
|
||||
|
@ -377,7 +403,7 @@ def signal_handler(sig, frame):
|
|||
ctrlc_pressed = True
|
||||
|
||||
|
||||
def parse_export_options(options:str, vflip:bool=False, hflip:bool=False):
|
||||
def parse_export_options(options:str, vflip:int=0, hflip:int=0):
|
||||
if vflip:
|
||||
options += ',vflip'
|
||||
if hflip:
|
||||
|
@ -404,94 +430,24 @@ def export_animation(input_filename, export_filename):
|
|||
|
||||
def main(args):
|
||||
|
||||
global onionskin, playback, loop_playback, playhead, index, img_list, first_playback
|
||||
global onionskin, playback, loop_playback, playhead, index, img_list, first_playback, camera_current_settings
|
||||
|
||||
if not testDevice(0):
|
||||
print(_("No camera device found. Exiting..."))
|
||||
return 1
|
||||
cam = cv2.VideoCapture(0)
|
||||
# TODO : find highest def available and use that
|
||||
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
|
||||
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
|
||||
cam.set(cv2.CAP_PROP_FRAME_WIDTH, camera_settings['cam_w'])
|
||||
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, camera_settings['cam_h'])
|
||||
|
||||
frame = get_onionskin_frame(savepath, index)
|
||||
|
||||
# TODO : (re)set camera settings on startup
|
||||
# Using serial to send v4l2-ctl cmd to the camera
|
||||
# Use v4l-ctl to flip frame
|
||||
# v4l2-ctl -d /dev/video0 -c vertical_flip=1 -c control=value
|
||||
# DEPRECATED : Using config file and loading with camera-ctl
|
||||
# Write config file to /tmp/blah
|
||||
# ~ write_config_file = '''rm /tmp/blah && echo "power_line_frequency=2
|
||||
# ~ sharpness=50
|
||||
# ~ video_bitrate=25000000
|
||||
# ~ auto_exposure=1
|
||||
# ~ auto_exposure_bias=2
|
||||
# ~ white_balance_auto_preset=3
|
||||
# ~ exposure_metering_mode=1
|
||||
# ~ " > /tmp/blah'''
|
||||
# Apply config
|
||||
# ~ apply_config = '/opt/camera-control/camera-ctl -c /tmp/blah -v /dev/video0 -i repeat_sequence_header -i h264_i_frame_period -i h264_level -i h264_profile -i compression_quality\rl\rq\r'
|
||||
# ~ serialutils.send_serial_cmd(serialutils.find_cam_port(), write_config_file)
|
||||
# ~ serialutils.send_serial_cmd(serialutils.find_cam_port(), apply_config)
|
||||
|
||||
# ~ User Controls
|
||||
|
||||
# ~ brightness 0x00980900 (int) : min=0 max=100 step=1 default=50 value=50 flags=slider
|
||||
# ~ contrast 0x00980901 (int) : min=-100 max=100 step=1 default=0 value=-2 flags=slider
|
||||
# ~ saturation 0x00980902 (int) : min=-100 max=100 step=1 default=0 value=5 flags=slider
|
||||
# ~ red_balance 0x0098090e (int) : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
|
||||
# ~ blue_balance 0x0098090f (int) : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
|
||||
# ~ horizontal_flip 0x00980914 (bool) : default=0 value=0
|
||||
# ~ vertical_flip 0x00980915 (bool) : default=0 value=0
|
||||
# ~ power_line_frequency 0x00980918 (menu) : min=0 max=3 default=1 value=1
|
||||
# ~ sharpness 0x0098091b (int) : min=-100 max=100 step=1 default=0 value=10 flags=slider
|
||||
# ~ color_effects 0x0098091f (menu) : min=0 max=15 default=0 value=0
|
||||
# ~ rotate 0x00980922 (int) : min=0 max=360 step=90 default=0 value=0 flags=modify-layout
|
||||
# ~ color_effects_cbcr 0x0098092a (int) : min=0 max=65535 step=1 default=32896 value=32896
|
||||
|
||||
# ~ Codec Controls
|
||||
|
||||
# ~ video_bitrate_mode 0x009909ce (menu) : min=0 max=1 default=0 value=0 flags=update
|
||||
# ~ video_bitrate 0x009909cf (int) : min=25000 max=25000000 step=25000 default=10000000 value=25000000
|
||||
# ~ repeat_sequence_header 0x009909e2 (bool) : default=0 value=0
|
||||
# ~ h264_i_frame_period 0x00990a66 (int) : min=0 max=2147483647 step=1 default=60 value=60
|
||||
# ~ h264_level 0x00990a67 (menu) : min=0 max=11 default=11 value=11
|
||||
# ~ h264_profile 0x00990a6b (menu) : min=0 max=4 default=4 value=4
|
||||
|
||||
# ~ Camera Controls
|
||||
|
||||
# ~ auto_exposure 0x009a0901 (menu) : min=0 max=3 default=0 value=0
|
||||
# ~ exposure_time_absolute 0x009a0902 (int) : min=1 max=10000 step=1 default=1000 value=1000
|
||||
# ~ exposure_dynamic_framerate 0x009a0903 (bool) : default=0 value=0
|
||||
# ~ auto_exposure_bias 0x009a0913 (intmenu): min=0 max=24 default=12 value=2
|
||||
# ~ white_balance_auto_preset 0x009a0914 (menu) : min=0 max=9 default=1 value=1
|
||||
# ~ image_stabilization 0x009a0916 (bool) : default=0 value=0
|
||||
# ~ iso_sensitivity 0x009a0917 (intmenu): min=0 max=4 default=0 value=0
|
||||
# ~ iso_sensitivity_auto 0x009a0918 (menu) : min=0 max=1 default=1 value=1
|
||||
# ~ exposure_metering_mode 0x009a0919 (menu) : min=0 max=3 default=0 value=0
|
||||
# ~ scene_mode 0x009a091a (menu) : min=0 max=13 default=0 value=0
|
||||
|
||||
# ~ JPEG Compression Controls
|
||||
# ~ compression_quality 0x009d0903 (int) : min=1 max=100 step=1 default=30 value=30
|
||||
|
||||
if project_settings['cam_is_showmewebcam']:
|
||||
# Make sure we're using max bitrate
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c video_bitrate=25000000')
|
||||
# Flip auto-exposure, white-balance on and off to adapt to light environment
|
||||
reset_wb_exp()
|
||||
# Flip preview (0 = vert; 1 = hor)
|
||||
if project_settings['vflip']:
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c vertical_flip=1')
|
||||
else:
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c vertical_flip=0')
|
||||
if project_settings['hflip']:
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c horizontal_flip=1')
|
||||
else:
|
||||
serialutils.send_serial_cmd(serialutils.find_cam_port(), 'v4l2-ctl -d /dev/video0 -c horizontal_flip=0')
|
||||
# Apply config camera settings
|
||||
camera_current_settings = apply_cam_setting(camera_current_settings)
|
||||
time.sleep(.5)
|
||||
|
||||
loop_delta = 0
|
||||
while True:
|
||||
print(first_playback)
|
||||
start = timer()
|
||||
if playback:
|
||||
if onionskin:
|
||||
|
@ -542,6 +498,15 @@ def main(args):
|
|||
if (k%256 == 111) or (k%256 == 47):
|
||||
# Toggle onionskin
|
||||
onionskin = not onionskin
|
||||
# Key w - cycle wb
|
||||
if (k%256 == 119):
|
||||
camera_current_settings = apply_cam_setting(camera_current_settings, ['white_balance_auto_preset'])
|
||||
# Key x - cycle exposure
|
||||
if (k%256 == 120):
|
||||
camera_current_settings = apply_cam_setting(camera_current_settings, ['auto_exposure'])
|
||||
# Key f - flip image
|
||||
if (k%256 == 102):
|
||||
camera_current_settings = apply_cam_setting(camera_current_settings, ['vertical_flip','horizontal_flip'])
|
||||
# Key up
|
||||
elif (k%256 == 82) or (k%256 == 56):
|
||||
if len(img_list):
|
||||
|
@ -554,7 +519,6 @@ def main(args):
|
|||
if playback:
|
||||
playback = False
|
||||
index, frame = first_frame(index)
|
||||
print(index)
|
||||
# Key left
|
||||
elif (k%256 == 81) or (k%256 == 52):
|
||||
# Displau previous frame
|
||||
|
@ -562,6 +526,7 @@ def main(args):
|
|||
if playback:
|
||||
playback = False
|
||||
index, frame = previous_frame(index)
|
||||
# Key right
|
||||
elif (k%256 == 83) or (k%256 == 54):
|
||||
# Displau next frame
|
||||
if len(img_list):
|
||||
|
@ -570,7 +535,9 @@ def main(args):
|
|||
index, frame = next_frame(index)
|
||||
# Key r / keypad 9 - reset wb,exp
|
||||
elif (k%256 == 114) or (k%256 == 57):
|
||||
reset_wb_exp()
|
||||
print(_("Reset camera settings"))
|
||||
camera_current_settings = apply_cam_setting(camera_current_settings)
|
||||
# ~ reset_wb_exp()
|
||||
# Key e / keypad *
|
||||
elif (k%256 == 101) or (k%256 == 42):
|
||||
print(_("Export"))
|
||||
|
@ -616,7 +583,6 @@ def main(args):
|
|||
print(k) # else print its value
|
||||
end = timer()
|
||||
loop_delta = end - start
|
||||
print(loop_playback)
|
||||
|
||||
if 'ffmpeg_process' in locals():
|
||||
if ffmpeg_process.poll() is None:
|
||||
|
@ -658,15 +624,13 @@ else:
|
|||
project_letter = 'A'
|
||||
img_list = get_frames_list(savepath)
|
||||
index = len(img_list)-1
|
||||
print(project_letter)
|
||||
|
||||
# Export settings
|
||||
input_filename = "{folder}{sep}{letter}.%04d.{ext}".format(folder=savepath, sep=os.sep, letter=project_letter, ext=project_settings['file_extension'])
|
||||
print(input_filename)
|
||||
input_options = ["image2", str(project_settings['framerate'])]
|
||||
# ~ output_filename = "{folder}{sep}{filename}.mp4".format(folder=projects_folder, sep=os.sep, filename=savepath.split(os.sep)[-1])
|
||||
output_filename = "{filename}.mp4".format(filename=project_letter)
|
||||
output_options = parse_export_options(project_settings['export_options'], project_settings['vflip'], project_settings['hflip'] )
|
||||
output_options = project_settings['export_options']
|
||||
|
||||
export_filename = os.path.join(savepath, output_filename)
|
||||
|
||||
|
|
Binary file not shown.
|
@ -5,9 +5,9 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2024-09-12 18:30+0200\n"
|
||||
"PO-Revision-Date: 2024-09-12 18:30+0200\n"
|
||||
"Last-Translator: arthus <arthus@ateliers>\n"
|
||||
"POT-Creation-Date: 2024-11-01 07:59+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -15,91 +15,104 @@ msgstr ""
|
|||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
#: ../frame_opencv.py:50
|
||||
#: ../frame_opencv.py:53
|
||||
msgid "No configuration file found, using defaults."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:61
|
||||
#: ../frame_opencv.py:65
|
||||
msgid "Found configuration file in {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:99
|
||||
msgid "Unknown setting!"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:105
|
||||
msgid "Camera function not supported."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:144
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:119
|
||||
#: ../frame_opencv.py:158
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:195
|
||||
#: ../frame_opencv.py:234
|
||||
msgid ""
|
||||
"A previous session was found in\n {},\n"
|
||||
"A previous session was found in\n"
|
||||
" {},\n"
|
||||
" resume shooting ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:206
|
||||
#: ../frame_opencv.py:245
|
||||
msgid "Using {} as session folder."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:322
|
||||
#: ../frame_opencv.py:355
|
||||
msgid "{} does not exist"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:343
|
||||
#: ../frame_opencv.py:376
|
||||
msgid "Removing {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:364
|
||||
#: ../frame_opencv.py:395
|
||||
msgid "Warning: unable to open video source: {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:405
|
||||
#: ../frame_opencv.py:436
|
||||
msgid "No camera device found. Exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:523
|
||||
#: ../frame_opencv.py:489
|
||||
msgid "Failed to grab frame."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:566
|
||||
#: ../frame_opencv.py:538
|
||||
msgid "Reset camera settings"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:543
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:570
|
||||
#: ../frame_opencv.py:547
|
||||
msgid "Playback"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:577
|
||||
#: ../frame_opencv.py:554
|
||||
msgid "Remove frame"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:582
|
||||
#: ../frame_opencv.py:559
|
||||
msgid "Escape hit, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:585
|
||||
#: ../frame_opencv.py:562
|
||||
msgid "Ctrl-C hit, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:588
|
||||
#: ../frame_opencv.py:565
|
||||
msgid "Window was closed, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:596
|
||||
#: ../frame_opencv.py:573
|
||||
msgid "File {} written."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:613 ../frame_opencv.py:614
|
||||
#: ../frame_opencv.py:589 ../frame_opencv.py:590
|
||||
msgid ""
|
||||
"Ffmpeg is still running.\n"
|
||||
" Waiting for task to complete."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:623
|
||||
#: ../frame_opencv.py:599
|
||||
msgid "Terminating running process..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:642
|
||||
#: ../frame_opencv.py:619
|
||||
msgid "No images yet! Start shooting..."
|
||||
msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -6,10 +6,10 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2024-09-12 16:29+0200\n"
|
||||
"PO-Revision-Date: 2024-09-12 18:31+0200\n"
|
||||
"PO-Revision-Date: 2024-11-01 09:18+0100\n"
|
||||
"Last-Translator: arthus <arthus@ateliers>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: French\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -35,6 +35,7 @@ msgstr "Non"
|
|||
msgid "A previous session was found in\n {},\n resume shooting ?"
|
||||
msgstr "Une session précédente à été trouvée dans\n {},\n reprendre la session ?"
|
||||
|
||||
|
||||
#: ../frame_opencv.py:206
|
||||
msgid "Using {} as session folder."
|
||||
msgstr "Utilisation de {} comme dossier de session."
|
||||
|
@ -49,11 +50,11 @@ msgstr "Suppression de {}"
|
|||
|
||||
#: ../frame_opencv.py:384
|
||||
msgid "Warning: unable to open video source: {}"
|
||||
msgstr "Attention: périphérique vidéo introuvable : {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:425
|
||||
msgid "No camera device found. Exiting..."
|
||||
msgstr "Aucune caméra trouvée. Fermeture..."
|
||||
msgstr "Attention: périphérique vidéo introuvable : {}"
|
||||
|
||||
#: ../frame_opencv.py:542
|
||||
msgid "Failed to grab frame."
|
||||
|
@ -99,39 +100,40 @@ msgstr "Terminaison des processus en cours..."
|
|||
msgid "No images yet! Start shooting..."
|
||||
msgstr "Aucune image! Commencez à tourner..."
|
||||
|
||||
#~ msgid "Warning: Some settings are not set to the recommended value!"
|
||||
#~ msgstr "Attention: certains paramètres ne sont pas optimaux!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ "Camera not found or busy."
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ "Caméra introuvable ou occupée."
|
||||
msgid "Warning: Some settings are not set to the recommended value!"
|
||||
msgstr "Attention: certains paramètres ne sont pas optimaux!"
|
||||
|
||||
#~ msgid "Resume session?"
|
||||
#~ msgstr "Reprendre la session ?"
|
||||
msgid ""
|
||||
"\n"
|
||||
"Camera not found or busy."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Caméra introuvable ou occupée."
|
||||
|
||||
#~ msgid "Image is being saved to {}"
|
||||
#~ msgstr "Image sauvegardée dans {}"
|
||||
msgid "Resume session?"
|
||||
msgstr "Reprendre la session ?"
|
||||
|
||||
#~ msgid "speed too high"
|
||||
#~ msgstr "Vitesse trop élevée."
|
||||
msgid "Image is being saved to {}"
|
||||
msgstr "Image sauvegardée dans {}"
|
||||
|
||||
#~ msgid "Speed too low."
|
||||
#~ msgstr "Vitesse trop basse."
|
||||
msgid "speed too high"
|
||||
msgstr "Vitesse trop élevée."
|
||||
|
||||
#~ msgid "Saving {}{}"
|
||||
#~ msgstr "Enregistrement de {}{}"
|
||||
msgid "Speed too low."
|
||||
msgstr "Vitesse trop basse."
|
||||
|
||||
#~ msgid "Getting file {}"
|
||||
#~ msgstr "Récupération du fichier {}"
|
||||
msgid "Saving {}{}"
|
||||
msgstr "Enregistrement de {}{}"
|
||||
|
||||
#~ msgid "Ending thread"
|
||||
#~ msgstr "Terminaison du processus."
|
||||
msgid "Getting file {}"
|
||||
msgstr "Récupération du fichier {}"
|
||||
|
||||
#~ msgid "Exporting to {}"
|
||||
#~ msgstr "Exportation dans {}"
|
||||
msgid "Ending thread"
|
||||
msgstr "Terminaison du processus."
|
||||
|
||||
#~ msgid "Mp4 files"
|
||||
#~ msgstr "Fichier Mp4"
|
||||
msgid "Exporting to {}"
|
||||
msgstr "Exportation dans {}"
|
||||
|
||||
msgid "Mp4 files"
|
||||
msgstr "Fichier Mp4"
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR ORGANIZATION
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2024-02-18 11:30+0100\n"
|
||||
"PO-Revision-Date: 2024-09-09 12:28+0200\n"
|
||||
"Last-Translator: arthus <arthus@ateliers>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
#: ../main_c.py:96
|
||||
msgid "No configuration file found, using defaults."
|
||||
msgstr "Aucun fichier de configuration trouvé, utilisation des valeurs par défaut."
|
||||
|
||||
#: ../main_c.py:87
|
||||
msgid "Found configuration file in {}"
|
||||
msgstr "Fichier de configuration trouvé dans {}"
|
||||
|
||||
#: ../main_c.py:156
|
||||
msgid "No images yet! Start shooting..."
|
||||
msgstr "Aucune image! Commencez à tourner..."
|
||||
|
||||
#: ../main_c.py:144
|
||||
msgid "Warning: Some settings are not set to the recommended value!"
|
||||
msgstr "Attention: certains paramètres ne sont pas optimaux!"
|
||||
|
||||
#: ../main_c.py:146
|
||||
msgid ""
|
||||
"\n"
|
||||
"Camera not found or busy."
|
||||
msgstr "\nCaméra introuvable ou occupée."
|
||||
|
||||
#: ../main_c.py:256
|
||||
msgid "A previous session was found in {},\n resume shooting ?"
|
||||
msgstr "Une session précédente à été trouvée dans {},\n reprendre la session ?"
|
||||
|
||||
#: ../main_c.py:256
|
||||
msgid "Resume session?"
|
||||
msgstr "Reprendre la session ?"
|
||||
|
||||
#: ../main_c.py:263
|
||||
msgid "Using {} as session folder."
|
||||
msgstr "Utilisation de {} comme dossier de session."
|
||||
|
||||
#: ../main_c.py:281
|
||||
msgid "Image is being saved to {}"
|
||||
msgstr "Image sauvegardée dans {}"
|
||||
|
||||
#: ../main_c.py:320
|
||||
msgid "{} does not exist"
|
||||
msgstr "{} n'existe pas."
|
||||
|
||||
#: ../main_c.py:345
|
||||
msgid "Removing {}"
|
||||
msgstr "Suppression de {}"
|
||||
|
||||
#: ../main_c.py:563
|
||||
msgid "speed too high"
|
||||
msgstr "Vitesse trop élevée."
|
||||
|
||||
#: ../main_c.py:576
|
||||
msgid "Speed too low."
|
||||
msgstr "Vitesse trop basse."
|
||||
|
||||
#: ../main_c.py:604
|
||||
msgid "Saving {}{}"
|
||||
msgstr "Enregistrement de {}{}"
|
||||
|
||||
#: ../main_c.py:606
|
||||
msgid "Getting file {}"
|
||||
msgstr "Récupération du fichier {}"
|
||||
|
||||
#: ../main_c.py:621
|
||||
msgid "Ending thread"
|
||||
msgstr "Terminaison du processus."
|
||||
|
||||
#: ../main_c.py:650
|
||||
msgid "Exporting to {}"
|
||||
msgstr "Exportation dans {}"
|
||||
|
||||
msgid "Mp4 files"
|
||||
msgstr "Fichier Mp4"
|
||||
|
||||
msgid "Ffmpeg is still running.\n Waiting for task to complete."
|
||||
msgstr "Ffmpeg est toujours en cours d'éxécution.\n Attente de la fin du processus.'"
|
||||
|
||||
msgid "Terminating running process..."
|
||||
msgstr "Terminaison des processus en cours..."
|
|
@ -1,6 +1,8 @@
|
|||
#!/usr/bin/env bash
|
||||
# /usr/lib/python3.11/Tools/i18n/pygettext.py -o template.pot ../app.py
|
||||
#
|
||||
# /usr/lib/python3.12/Tools/i18n/pygettext.py -o template.pot ../frame_opencv.py
|
||||
# msgmerge -N template.pot fr/LC_MESSAGES/template.pot -o new.pot
|
||||
# Change to script dir
|
||||
cd "$(dirname "$0")"
|
||||
for locale in */LC_MESSAGES/template.pot; do
|
||||
|
|
|
@ -1,105 +0,0 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR ORGANIZATION
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2024-09-12 16:29+0200\n"
|
||||
"PO-Revision-Date: 2024-09-12 17:55+0200\n"
|
||||
"Last-Translator: arthus <arthus@ateliers>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
#: ../frame_opencv.py:50
|
||||
msgid "No configuration file found, using defaults."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:61
|
||||
msgid "Found configuration file in {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:105
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:119
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:195
|
||||
msgid ""
|
||||
"A previous session was found in {},\n"
|
||||
" resume shooting ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:206
|
||||
msgid "Using {} as session folder."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:322
|
||||
msgid "{} does not exist"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:343
|
||||
msgid "Removing {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:384
|
||||
msgid "Warning: unable to open video source: {}"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:425
|
||||
msgid "No camera device found. Exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:542
|
||||
msgid "Failed to grab frame."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:585
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:589
|
||||
msgid "Playback"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:596
|
||||
msgid "Remove frame"
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:601
|
||||
msgid "Escape hit, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:604
|
||||
msgid "Ctrl-C hit, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:607
|
||||
msgid "Window was closed, exiting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:615
|
||||
msgid "File {} written."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:632 ../frame_opencv.py:633
|
||||
msgid ""
|
||||
"Ffmpeg is still running.\n"
|
||||
" Waiting for task to complete."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:642
|
||||
msgid "Terminating running process..."
|
||||
msgstr ""
|
||||
|
||||
#: ../frame_opencv.py:661
|
||||
msgid "No images yet! Start shooting..."
|
||||
msgstr ""
|
||||
|
Loading…
Reference in New Issue