mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Merge pull request #2088 from kwagyeman/kwabena/fix_bayer
ports: Fix sensor bayer image with cropping and transpose.
This commit is contained in:
commit
a3be7d6fa8
@ -10,6 +10,53 @@
|
|||||||
*/
|
*/
|
||||||
#include "imlib.h"
|
#include "imlib.h"
|
||||||
|
|
||||||
|
pixformat_t imlib_bayer_shift(pixformat_t pixfmt, int x, int y, bool transpose) {
|
||||||
|
bool shift_right = x % 2;
|
||||||
|
bool shift_down = y % 2;
|
||||||
|
|
||||||
|
switch (pixfmt) {
|
||||||
|
case PIXFORMAT_BAYER_BGGR: {
|
||||||
|
if (shift_right && shift_down) {
|
||||||
|
return PIXFORMAT_BAYER_RGGB;
|
||||||
|
} else if (shift_right) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GRBG : PIXFORMAT_BAYER_GBRG;
|
||||||
|
} else if (shift_down) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GBRG : PIXFORMAT_BAYER_GRBG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PIXFORMAT_BAYER_GBRG: {
|
||||||
|
if (shift_right && shift_down) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GBRG : PIXFORMAT_BAYER_GRBG;
|
||||||
|
} else if (shift_right) {
|
||||||
|
return PIXFORMAT_BAYER_BGGR;
|
||||||
|
} else if (shift_down) {
|
||||||
|
return PIXFORMAT_BAYER_RGGB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PIXFORMAT_BAYER_GRBG: {
|
||||||
|
if (shift_right && shift_down) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GRBG : PIXFORMAT_BAYER_GBRG;
|
||||||
|
} else if (shift_right) {
|
||||||
|
return PIXFORMAT_BAYER_RGGB;
|
||||||
|
} else if (shift_down) {
|
||||||
|
return PIXFORMAT_BAYER_BGGR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PIXFORMAT_BAYER_RGGB: {
|
||||||
|
if (shift_right && shift_down) {
|
||||||
|
return PIXFORMAT_BAYER_BGGR;
|
||||||
|
} else if (shift_right) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GBRG : PIXFORMAT_BAYER_GRBG;
|
||||||
|
} else if (shift_down) {
|
||||||
|
return transpose ? PIXFORMAT_BAYER_GRBG : PIXFORMAT_BAYER_GBRG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return pixfmt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void imlib_debayer_line(int x_start, int x_end, int y_row, void *dst_row_ptr, pixformat_t pixfmt, image_t *src) {
|
void imlib_debayer_line(int x_start, int x_end, int y_row, void *dst_row_ptr, pixformat_t pixfmt, image_t *src) {
|
||||||
int src_w = src->w, w_limit = src_w - 1, w_limit_m_1 = w_limit - 1;
|
int src_w = src->w, w_limit = src_w - 1, w_limit_m_1 = w_limit - 1;
|
||||||
int src_h = src->h, h_limit = src_h - 1, h_limit_m_1 = h_limit - 1;
|
int src_h = src->h, h_limit = src_h - 1, h_limit_m_1 = h_limit - 1;
|
||||||
|
|||||||
@ -1138,6 +1138,7 @@ void imlib_fill_image_from_float(image_t *img, int w, int h, float *data, float
|
|||||||
bool mirror, bool flip, bool dst_transpose, bool src_transpose);
|
bool mirror, bool flip, bool dst_transpose, bool src_transpose);
|
||||||
|
|
||||||
// Bayer Image Processing
|
// Bayer Image Processing
|
||||||
|
pixformat_t imlib_bayer_shift(pixformat_t pixfmt, int x, int y, bool transpose);
|
||||||
void imlib_debayer_line(int x_start, int x_end, int y_row, void *dst_row_ptr, pixformat_t pixfmt, image_t *src);
|
void imlib_debayer_line(int x_start, int x_end, int y_row, void *dst_row_ptr, pixformat_t pixfmt, image_t *src);
|
||||||
void imlib_debayer_image(image_t *dst, image_t *src);
|
void imlib_debayer_image(image_t *dst, image_t *src);
|
||||||
|
|
||||||
|
|||||||
@ -1055,53 +1055,7 @@ static mp_obj_t py_image_to(pixformat_t pixfmt, const uint16_t *default_color_pa
|
|||||||
(alpha_palette != NULL)) {
|
(alpha_palette != NULL)) {
|
||||||
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Only bayer copying/cropping is supported!"));
|
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Only bayer copying/cropping is supported!"));
|
||||||
} else {
|
} else {
|
||||||
bool shift_right = arg_roi.x % 2;
|
dst_img.pixfmt = imlib_bayer_shift(dst_img.pixfmt, arg_roi.x, arg_roi.y, false);
|
||||||
bool shift_down = arg_roi.y % 2;
|
|
||||||
switch (dst_img.pixfmt) {
|
|
||||||
case PIXFORMAT_BAYER_BGGR: {
|
|
||||||
if (shift_right && shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
|
|
||||||
} else if (shift_right) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
|
|
||||||
} else if (shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PIXFORMAT_BAYER_GBRG: {
|
|
||||||
if (shift_right && shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
|
|
||||||
} else if (shift_right) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
|
|
||||||
} else if (shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PIXFORMAT_BAYER_GRBG: {
|
|
||||||
if (shift_right && shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
|
|
||||||
} else if (shift_right) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_RGGB;
|
|
||||||
} else if (shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PIXFORMAT_BAYER_RGGB: {
|
|
||||||
if (shift_right && shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_BGGR;
|
|
||||||
} else if (shift_right) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GRBG;
|
|
||||||
} else if (shift_down) {
|
|
||||||
dst_img.pixfmt = PIXFORMAT_BAYER_GBRG;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hint &= ~(IMAGE_HINT_AREA |
|
hint &= ~(IMAGE_HINT_AREA |
|
||||||
IMAGE_HINT_BICUBIC |
|
IMAGE_HINT_BICUBIC |
|
||||||
IMAGE_HINT_BILINEAR |
|
IMAGE_HINT_BILINEAR |
|
||||||
|
|||||||
@ -480,6 +480,7 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) {
|
|||||||
case PIXFORMAT_BAYER:
|
case PIXFORMAT_BAYER:
|
||||||
MAIN_FB()->pixfmt = PIXFORMAT_BAYER;
|
MAIN_FB()->pixfmt = PIXFORMAT_BAYER;
|
||||||
MAIN_FB()->subfmt_id = sensor->hw_flags.bayer;
|
MAIN_FB()->subfmt_id = sensor->hw_flags.bayer;
|
||||||
|
MAIN_FB()->pixfmt = imlib_bayer_shift(MAIN_FB()->pixfmt, MAIN_FB()->x, MAIN_FB()->y, sensor->transpose);
|
||||||
break;
|
break;
|
||||||
case PIXFORMAT_YUV422: {
|
case PIXFORMAT_YUV422: {
|
||||||
bool yuv_order = sensor->hw_flags.yuv_order == SENSOR_HW_FLAGS_YUV422;
|
bool yuv_order = sensor->hw_flags.yuv_order == SENSOR_HW_FLAGS_YUV422;
|
||||||
|
|||||||
@ -571,6 +571,7 @@ UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/sensors/, \
|
|||||||
)
|
)
|
||||||
|
|
||||||
UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/imlib/,\
|
UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/imlib/,\
|
||||||
|
bayer.o \
|
||||||
lab_tab.o \
|
lab_tab.o \
|
||||||
xyz_tab.o \
|
xyz_tab.o \
|
||||||
rainbow_tab.o \
|
rainbow_tab.o \
|
||||||
|
|||||||
@ -971,6 +971,7 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) {
|
|||||||
case PIXFORMAT_BAYER:
|
case PIXFORMAT_BAYER:
|
||||||
MAIN_FB()->pixfmt = PIXFORMAT_BAYER;
|
MAIN_FB()->pixfmt = PIXFORMAT_BAYER;
|
||||||
MAIN_FB()->subfmt_id = sensor->hw_flags.bayer;
|
MAIN_FB()->subfmt_id = sensor->hw_flags.bayer;
|
||||||
|
MAIN_FB()->pixfmt = imlib_bayer_shift(MAIN_FB()->pixfmt, MAIN_FB()->x, MAIN_FB()->y, sensor->transpose);
|
||||||
break;
|
break;
|
||||||
case PIXFORMAT_YUV422: {
|
case PIXFORMAT_YUV422: {
|
||||||
bool yuv_order = sensor->hw_flags.yuv_order == SENSOR_HW_FLAGS_YUV422;
|
bool yuv_order = sensor->hw_flags.yuv_order == SENSOR_HW_FLAGS_YUV422;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user