#22 Fix distortion bug

This commit is contained in:
James Hodgson
2022-10-07 17:18:53 +01:00
parent bdb5c39d0c
commit 264753259a
4 changed files with 34 additions and 4 deletions

View File

@@ -22,7 +22,10 @@ Specifies the camera type (`picam` interface implementation) to use.
``` ```
### `capture_resolution` ### `capture_resolution`
Specifies the resolution of the photos to take Specifies the resolution of the photos to take.
For picam1 implementation (and maybe more!), the X value will be rounded up to a multiple of 32, and the Y value to a multiple of 16, otherwise we'll get bugs due to the behaviour described in the [docs](https://picamera.readthedocs.io/en/release-1.13/recipes2.html#unencoded-image-capture-yuv-format)
### `preview_resolution` ### `preview_resolution`
Specifies the resolution of the viewfinder. I've set this to the resolution of the hyperpixel4 display Specifies the resolution of the viewfinder. I've set this to the resolution of the hyperpixel4 display

View File

@@ -1,6 +1,6 @@
{ {
"camera_type": 1, "camera_type": 1,
"capture_resolution": [3464, 2309], "capture_resolution": [3000, 2000],
"preview_resolution": [800, 480], "preview_resolution": [800, 480],
"output_format": "JPEG", "output_format": "JPEG",
"output_extension": ".jpg", "output_extension": ".jpg",

View File

@@ -1,4 +1,5 @@
from picam.picam import PiCam from picam.picam import PiCam
from utils.utils import round_resolution
from io import BytesIO from io import BytesIO
from picamera import PiCamera from picamera import PiCamera
@@ -22,8 +23,16 @@ class PiCam1(PiCam):
self.camera.resolution = resolution self.camera.resolution = resolution
def set_preview_resolution(self, resolution: "tuple[int, int]") -> None: def set_preview_resolution(self, resolution: "tuple[int, int]") -> None:
self.set_camera_resolution(resolution) rounded_resolution = round_resolution(resolution, (32, 16))
return super().set_preview_resolution(resolution)
super().set_preview_resolution(rounded_resolution)
self.set_camera_resolution(self.preview_resolution)
def set_capture_resolution(self, resolution: "tuple[int, int]") -> None:
rounded_resolution = round_resolution(resolution, (32, 16))
return super().set_capture_resolution(rounded_resolution)
def init_camera(self) -> None: def init_camera(self) -> None:
"""Initialize picamera camera object""" """Initialize picamera camera object"""

18
src/utils/utils.py Normal file
View File

@@ -0,0 +1,18 @@
def round_value_up(value: int, multiple: int) -> int:
"""Round value up to the nearest of the given multiple
:param value: Value to round
:param multiple: Multiple to round the value up to
:returns: Rounded value
"""
value_mod = value % multiple
return value + (multiple - value_mod)
def round_resolution(resolution: "tuple[int, int]", multiples: "tuple[int, int]") -> "tuple[int, int]":
"""Round resolution up to the nearest of the given multiples
:param resolution: Resolution to round
:param multiples: Multiples to round the resolution values to
:returns: Tuple containing rounded resolution
"""
return (round_value_up(resolution[0], multiples[0]), round_value_up(resolution[0], multiples[0]))