diff --git a/config.toml b/config.toml index 3347bb9..ff43ee0 100644 --- a/config.toml +++ b/config.toml @@ -1,21 +1,23 @@ [DEFAULT] -cam_is_showmewebcam = true +cam_is_picam = true +cam_is_showmewebcam = false use_date_for_folder = false -file_extension = 'png' +file_extension = 'jpg' +jpg_quality = 88 projects_folder = '' onion_skin_onstartup = true onionskin_alpha_default = 0.5 fullscreen_bool = true -screen_w = 1920 -screen_h = 1080 +screen_w = 1440 +screen_h = 900 framerate = 16 ffmpeg_path = '/usr/bin/ffmpeg' export_options = 'scale=1920:-1,crop=1920:1080' [CAMERA] -cam_w = 1600 -cam_h = 900 -vflip = 1 -hflip = 1 +cam_w = 1920 +cam_h = 1080 +vflip = 0 +hflip = 0 auto_exposure = 1 -white_balance_auto_preset = 2 +white_balance_auto_preset = 1 video_bitrate=25000000 diff --git a/frame_opencv.py b/frame_opencv.py index 05309d5..7f9ba60 100644 --- a/frame_opencv.py +++ b/frame_opencv.py @@ -32,8 +32,10 @@ _ = gettext.translation('template', localedir='locales', languages=[LOCALE]).get project_settings_defaults = { 'cam_is_picam': True, 'cam_is_showmewebcam': False, + 'cam_is_dslr': False, 'use_date_for_folder': False, 'file_extension':'png', + 'jpg_quality':90, 'projects_folder': '', 'onion_skin_onstartup' : False, 'onionskin_alpha_default' : 0.4, @@ -71,6 +73,8 @@ for location in config_locations: config_found_msg = _("Found configuration file in {}").format(os.path.expanduser(location)) print(config_found_msg) + +# Populate default values according to config and camera type if project_settings['cam_is_showmewebcam']: camera_current_settings = { 'auto_exposure': dict(min=0, max=1, default=camera_settings['auto_exposure'], value=camera_settings['auto_exposure']), @@ -79,7 +83,8 @@ if project_settings['cam_is_showmewebcam']: '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']), } -else: +elif project_settings['cam_is_picam']: + # Todo : add framerate ? see "FrameDurationLimits" and "FrameDuration" in camera_controls FrameDurationLimits': (33333, 120000, None) camera_current_settings = { 'auto_exposure': dict(min=0, max=4, default=camera_settings['auto_exposure'], value=camera_settings['auto_exposure']), 'white_balance_auto_preset': dict(min=0, max=7, default=camera_settings['white_balance_auto_preset'], value=camera_settings['white_balance_auto_preset']), @@ -112,10 +117,14 @@ def apply_cam_setting(cam_settings:dict, to_set:list=None): else: print(_("Unknown setting!")) break + # TODO: Refactor to call method according to cam type if project_settings['cam_is_showmewebcam']: serialutils.send_serial_cmd(serialutils.find_cam_port(), cmd.format(*args)) + elif project_settings['cam_is_picam']: + pass + elif project_settings['cam_is_dslr']: + pass else: - # TODO: v4l2 support print(_("Camera function not supported.")) return cam_settings @@ -477,7 +486,8 @@ def main(args): 'AwbEnable': 1, 'AwbMode': camera_current_settings['white_balance_auto_preset']['default'], 'AeEnable': 1, - 'AeExposureMode': camera_current_settings['auto_exposure']['default'] + 'AeExposureMode': camera_current_settings['auto_exposure']['default'], + # ~ 'FrameDurationLimits':(40000,120000,None) }) # ~ cam.stop() @@ -658,7 +668,10 @@ def main(args): print(_("Capture frame")) img_name = return_next_frame_number(get_last_frame(savepath)) img_path = os.path.join(savepath, img_name) - cv2.imwrite(img_path, og_frame) + if project_settings['file_extension'] == 'jpg': + cv2.imwrite(img_path, og_frame, [int(cv2.IMWRITE_JPEG_QUALITY), project_settings['jpg_quality']]) + else: + cv2.imwrite(img_path, og_frame) print(_("File {} written.").format(img_path)) if len(img_list) and (img_list[index] == '{letter}.-001.{ext}'.format(letter=project_letter, ext=project_settings['file_extension'])): img_list[index] = img_name diff --git a/readme.md b/readme.md index d9367a4..c0be81a 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,14 @@ # Stopi2 +## Branche libcamera + +**Ceci est la branche qui restaure la possibilité d'utiliser des périphériques compatibles rpi-libcamera (Modules Raspicam v1,v2 et v3).** + Seconde version du script python [stopi](https://git.arthus.net/arthus/stopi) destiné à être utilisé avec une télécommande [picote](/arthus/picote). -Cette version utilise opencv et ne fonctionne pour le moment qu'avec une webcam. +Cette version utilise opencv et libcamera.Elle fonctionne avec une webcam ou un module vidéo Picamera (v1,v2 ou v3). Encore une fois, l'objectif est de créer un logiciel simple et minimaliste dans son interface, dont les caractéristiques sont les suivantes : * Affichage des images en plein écran sans interface : toutes les fonctions utilisent quelques touches du clavier. @@ -17,7 +21,7 @@ Encore une fois, l'objectif est de créer un logiciel simple et minimaliste dans ## Banc de test -Ce script a été testé avec une webcam compatible V4L2, et plus précisement une ["showmewebcam"](https://github.com/showmewebcam/showmewebcam) à base de rpi 0 et d'un module caméra v2 (8Mp), et un ordinateur classique sous [Debian](https://debian.org). +Ce script a été testé avec une webcam compatible V4L2, une ["showmewebcam"](https://github.com/showmewebcam/showmewebcam) à base de rpi 0 et d'un module caméra v2 (8Mp), et un ordinateur classique sous [Debian](https://debian.org) et un [RPI 4B](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/) munis d'un module [Picamera V3](https://www.raspberrypi.com/products/camera-module-3/). Les contributions et rapports de bugs sont les bienvenus ! ## Installation