You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

536 lines
19 KiB

2 weeks ago
#!/usr/bin/python
# -*- coding:utf-8 -*-
# -*-mode:python ; tab-width:4 -*- ex:set tabstop=4 shiftwidth=4 expandtab: -*-
import numpy
from .gxwrapper import *
from .dxwrapper import *
from .gxidef import *
from .ImageProc import *
import threading
import types
if sys.version_info.major > 2:
INT_TYPE = int
else:
INT_TYPE = (int, long)
class ImageProcessConfig:
def __init__(self, color_correction_param):
self.valid_bits = DxValidBit.BIT0_7
self.b_defective_pixel_correct = False
self.b_denoise = False
self.b_sharpness = False
self.b_flip = False
self.b_color_correction = False
self.b_accelerate = False
self.b_user_set_mode = False
self.sharp_factor = 0.1
self.convert_type = DxBayerConvertType.NEIGHBOUR
self.contrast_factor = 0
self.gamma_factor = 1.0
self.lightness_factor = 0
self.saturation_factor = 64
self.color_correction_param = color_correction_param
self.color_transform_factor = ColorTransformFactor()
self.color_transform_factor.fGain00 = 1
self.color_transform_factor.fGain01 = 0
self.color_transform_factor.fGain02 = 0
self.color_transform_factor.fGain10 = 0
self.color_transform_factor.fGain11 = 1
self.color_transform_factor.fGain12 = 0
self.color_transform_factor.fGain20 = 0
self.color_transform_factor.fGain21 = 0
self.color_transform_factor.fGain22 = 1
self.cc_param_buffer = None
self.lut = None
self.lut_length = 0
self.gamma_lut = None
self.gamma_lut_length = 0
self.contrast_lut = None
self.contrast_lut_length = 0
self.mutex = threading.Lock()
self.__sharp_factor_min = 0.1
self.__sharp_factor_max = 5.0
self.__contrast_factor_min = -50
self.__contrast_factor_max = 100
self.__gamma_factor_min = 0.1
self.__gamma_factor_max = 10.0
self.__lightness_factor_min = -150
self.__lightness_factor_max = 150
self.__saturation_factor_min = 0
self.__saturation_factor_max = 128
self.set_gamma_param(self.gamma_factor)
self.set_contrast_param(self.contrast_factor)
self.set_lightness_param(self.lightness_factor)
self.set_saturation_param(self.saturation_factor)
def set_valid_bits(self, valid_bits):
"""
:brief Select Get the specified 8-bit valid data bits. This interface is set up for non-8-bit raw data
:param: valid_bits: Valid data bits 0 to 7, refer to DxValidBit
"""
if not isinstance(valid_bits, INT_TYPE):
raise ParameterTypeError("valid_bits param must be int in DxValidBit.")
self.valid_bits = valid_bits
def get_valid_bits(self):
"""
:brief Get the specified 8-bit valid data bits. This interface is set up for non-8-bit raw data
:return Valid data bits 0 to 7, refer to DxValidBit
"""
return self.valid_bits
def enable_defective_pixel_correct(self, enable):
"""
:brief enable defective pixel correct
:param: enable: True enable defective pixel correct, False disable defective pixel correct
"""
if not isinstance(enable, bool):
raise ParameterTypeError("enable param must is bool type.")
self.b_defective_pixel_correct = enable
def is_defective_pixel_correct(self):
"""
:brief get defective pixel correct status
:return True enable defective pixel correct, False disable defective pixel correct
"""
return self.b_defective_pixel_correct
def enable_sharpen(self, enable):
"""
:brief enable sharpen
:param: enable: True enable sharpen, False disable sharpen
"""
if not isinstance(enable, bool):
raise ParameterTypeError("enable param must is bool type.")
self.b_sharpness = enable
def is_sharpen(self):
"""
:brief get sharpen status
:return True enable sharpen, False disable sharpen
"""
return self.b_sharpness
def set_sharpen_param(self, param):
"""
:brief set sharpen param factor
:param: param: sharpen param factor (0.1 ~5.0)
"""
if not isinstance(param, (INT_TYPE, float)):
raise ParameterTypeError("param must to be int or float type.")
if (param >= self.__sharp_factor_min and param <= self.__sharp_factor_max):
self.sharp_factor = param
else:
raise UnexpectedError("SharpFactor Range is {%f}~{%f}" %(self.__sharp_factor_min, self.__sharp_factor_max))
def get_sharpen_param(self):
"""
:brief get sharpen param factor
:return sharpen param factor (0.1 ~5.0)
"""
return self.sharp_factor
def set_contrast_param(self, param):
"""
:brief set contrast param factor
:param: param: contrast param factor (-50, 100)
"""
if not (isinstance(param, INT_TYPE)):
raise ParameterTypeError("param must to be INT type.")
if (param >= self.__contrast_factor_min and param <= self.__contrast_factor_max):
self.contrast_factor = param
else:
raise UnexpectedError("ContrastFactor Range is {%d}~{%d}" %(self.__contrast_factor_min ,self.__contrast_factor_max))
self.__calc_lut()
self.__calc_contrast_lut()
def get_contrast_param(self):
"""
:brief get contrast param
:return contrast param factor (-50, 100)
"""
return self.contrast_factor
def set_gamma_param(self, param):
"""
:brief set gamma param factor
:param: param: gamma param factor (0.1, 10.0)
"""
if not (isinstance(param, (INT_TYPE, float))):
raise ParameterTypeError("param must to be INT or FLOAT type.")
if (param >= self.__gamma_factor_min and param <= self.__gamma_factor_max):
self.gamma_factor = param
else:
raise UnexpectedError("GammaFactor Range is {%f}~{%f}" %(self.__gamma_factor_min, self.__gamma_factor_max))
self.__calc_lut()
self.__calc_gamma_lut()
def get_gamma_param(self):
"""
:brief get contrast param factor
:return contrast param factor (0.1, 10.0)
"""
return self.gamma_factor
def set_lightness_param(self, param):
"""
:brief set lightness param factor
:param: param: lightness param factor (-150, 150)
"""
if not (isinstance(param, INT_TYPE)):
raise ParameterTypeError("param must to be INT type.")
if (param >= self.__lightness_factor_min and param <= self.__lightness_factor_max):
self.lightness_factor = param
else:
raise UnexpectedError("LightnessFactor Range is {%d}~{%d}" %(self.__lightness_factor_min, self.__lightness_factor_max))
self.__calc_lut()
def get_lightness_param(self):
"""
:brief get lightness param factor
:return lightness param factor (-150, 150)
"""
return self.lightness_factor
def enable_denoise(self, enable):
"""
:brief enable denoise not support mono camera
:param: enableTrue enable denoise, False disable enable denoise
"""
if not (isinstance(enable, bool)):
raise ParameterTypeError("param must to be bool type.")
self.b_denoise = enable
def is_denoise(self):
"""
:brief get denoise status not support mono camera
:return True enable denoise, False disable enable denoise
"""
return self.b_denoise
def set_saturation_param(self, param):
"""
:brief set saturation param not support mono camera
:param: param: saturation param (0, 128)
"""
if not (isinstance(param, INT_TYPE)):
raise ParameterTypeError("param must to be int type.")
if (param >= self.__saturation_factor_min and param <= self.__saturation_factor_max):
self.saturation_factor = param
else:
raise UnexpectedError("LightnessFactor Range is {%d}~{%d}" %(self.__saturation_factor_min, self.__saturation_factor_max))
if self.is_user_set_ccparam():
self.__calc_user_set_cc_param()
else:
self.__calc_cc_param()
def get_saturation_param(self):
"""
:brief get saturation param not support mono camera
:return saturation param (0, 128)
"""
return self.saturation_factor
def set_convert_type(self, cv_type):
"""
:brief set convert type not support mono camera
:param: param: convert type, refer to DxBayerConvertType
"""
if not isinstance(cv_type, INT_TYPE):
raise ParameterTypeError("cc_type param must be int in DxRGBChannelOrder.")
self.convert_type = cv_type
def get_convert_type(self):
"""
:brief get sconvert type not support mono camera
:return convert type, refer to DxBayerConvertType
"""
return self.convert_type
def enable_convert_flip(self, flip):
"""
:brief enable convert flip not support mono camera
:param: flipTrue enable convert flip, False disable convert flip
"""
if not isinstance(flip, bool):
raise ParameterTypeError("flip param must be bool type.")
self.b_flip = flip
def is_convert_flip(self):
"""
:brief get convert flip status not support mono camera
:return True enable convert flip, False disable convert flip
"""
return self.b_flip
def enable_accelerate(self, accelerate):
"""
:brief If the current CPU supports acceleration, setting acceleration throws an illegal call exception
:param: accelerate: True accelerate, False, not accelerate
"""
if not isinstance(accelerate, bool):
raise ParameterTypeError("accelerate param must be bool type.")
self.b_accelerate = accelerate
def is_accelerate(self):
"""
:brief get accelerate status
:return
"""
return self.b_accelerate
def enable_color_correction(self, enable):
"""
:brief enable color correction not support mono camera
:param: enable:True enable color correction, False disable color correction
"""
if not isinstance(enable, bool):
raise ParameterTypeError("enable param must be bool type.")
self.b_color_correction = enable
if self.is_user_set_ccparam():
self.__calc_user_set_cc_param()
else:
self.__calc_cc_param()
def is_color_correction(self):
"""
:brief get accelerate status not support mono camera
:return True enable color correction, False disable color correction
"""
return self.b_color_correction
def enable_user_set_ccparam(self, enable):
"""
:brief enable user mode not support mono camera
:param: enable: True user mode
"""
if not isinstance(enable, bool):
raise ParameterTypeError("enable param must be bool type.")
self.b_user_set_mode = enable
def is_user_set_ccparam(self):
"""
:brief get user mode status
:return
"""
return self.b_user_set_mode
def set_user_ccparam(self, color_transform_factor):
"""
:brief set user ccparam not support mono camera
:param: color_transform_factor: color correction parameter, refer to ColorTransformFactor
"""
if not isinstance(color_transform_factor, ColorTransformFactor):
raise ParameterTypeError("color_transform_factor param must be ColorTransformFactor type.")
self.color_transform_factor = color_transform_factor
def get_user_ccparam(self):
"""
:brief get user ccparam not support mono camera
:return
"""
return self.color_transform_factor
def get_color_correction_param(self):
"""
:brief get color correction param
:return
"""
if self.b_color_correction is True:
return self.color_correction_param
else:
return 0
def get_gamma_lut(self):
"""
:brief Calculating gamma lookup table (RGB24)
:param self.gamma_factor: gamma param,range(0.1 ~ 10)
:return: gamma_lut buffer
"""
if self.gamma_lut is None:
raise UnexpectedError("Gamma Lut is empty. You should first call set_gamma_param to calculate it.")
return Buffer(self.gamma_lut)
def get_contrast_lut(self):
"""
:brief Calculating contrast lookup table (RGB24)
:param self.contrast_factor: contrast param,range(-50 ~ 100)
:return: contrast_lut buffer
"""
if self.contrast_lut is None:
raise UnexpectedError("contrast lut Lut is empty. You should first call set_contrast_param to calculate it.")
return Buffer(self.contrast_lut)
def get_color_image_process(self, color_filter_layout):
color_img_process_param = DxColorImgProcess()
color_img_process_param.accelerate = self.is_accelerate()
color_img_process_param.defective_pixel_correct = self.is_defective_pixel_correct()
color_img_process_param.denoise = self.is_denoise()
color_img_process_param.flip = self.is_convert_flip()
color_img_process_param.sharpness = self.is_sharpen()
color_img_process_param.convert_type = self.get_convert_type()
color_img_process_param.color_filter_layout = color_filter_layout
color_img_process_param.sharp_factor = self.get_sharpen_param()
color_img_process_param.pro_lut, color_img_process_param.pro_lut_length = self.__get_lut()
color_img_process_param.cc_param_length = 18
color_img_process_param.cc_param = self.__get_calc_color_correction_param()
return color_img_process_param
def get_mono_image_process(self):
mono_img_process_param = DxMonoImgProcess()
mono_img_process_param.accelerate = self.is_accelerate()
mono_img_process_param.defective_pixel_correct = self.is_defective_pixel_correct()
mono_img_process_param.sharpness = self.is_sharpen()
mono_img_process_param.sharp_factor = self.get_sharpen_param()
mono_img_process_param.pro_lut, mono_img_process_param.pro_lut_length = self.__get_lut()
return mono_img_process_param
def get_mutex(self):
return self.mutex
def reset(self):
"""
:brief reset config
:return NONE
"""
self.valid_bits = DxValidBit.BIT0_7
self.b_defective_pixel_correct = False
self.b_denoise = False
self.b_sharpness = False
self.b_flip = False
self.b_color_correction = True
self.b_user_set_mode = False
self.sharp_factor = 0.1
self.convert_type = DxBayerConvertType.NEIGHBOUR
self.contrast_factor = 0
self.gamma_factor = 1.0
self.lightness_factor = 0
self.saturation_factor = 64
self.color_transform_factor = ColorTransformFactor()
self.color_transform_factor.fGain00 = 1
self.color_transform_factor.fGain01 = 0
self.color_transform_factor.fGain02 = 0
self.color_transform_factor.fGain10 = 0
self.color_transform_factor.fGain11 = 1
self.color_transform_factor.fGain12 = 0
self.color_transform_factor.fGain20 = 0
self.color_transform_factor.fGain21 = 0
self.color_transform_factor.fGain22 = 1
def __get_calc_color_correction_param(self):
"""
:brief calculating array of image processing color adjustment
:return: cc param buffer
"""
return Buffer(self.cc_param_buffer)
def __calc_cc_param(self):
"""
:brief calculating array of image processing color adjustment
:param self.color_correction_param: color correction param address(get from camera)
:param self.saturation_factor: saturation factor,Range(0~128)
:return: void
"""
with self.mutex:
status, cc_param = dx_calc_cc_param(self.get_color_correction_param(), self.saturation_factor)
if status != DxStatus.OK:
print("Utility.calc_cc_param: calc correction param failure, Error code:%s" % hex(status).__str__())
return None
self.cc_param_buffer = cc_param
def __calc_user_set_cc_param(self):
"""
:brief calculating array of image processing color adjustment
:param self.color_transform_factor: color correction param address(user set),
type should be list or tuple, size = 3*3=9
:param self.saturation_factor: saturation factor,Range(0~128)
:return: void
"""
with self.mutex:
status, cc_param = dx_calc_user_set_cc_param(self.color_transform_factor, self.saturation_factor)
if status != DxStatus.OK:
print("Utility.calc_user_set_cc_param: calc correction param failure, "
"Error code:%s" % hex(status).__str__())
return None
self.cc_param_buffer = cc_param
def __get_lut(self):
"""
:brief Calculating lookup table of 8bit image
:return: lut buffer, lut length
"""
return Buffer(self.lut), self.lut_length
def __calc_lut(self):
"""
:brief calculate the Lut value
:return NONE
"""
with self.mutex:
status, self.lut, self.lut_length = dx_get_lut(self.contrast_factor, self.gamma_factor, self.lightness_factor)
if status != DxStatus.OK:
raise UnexpectedError("dx_get_lut failure, Error code:%s" % hex(status).__str__())
def __calc_gamma_lut(self):
"""
:brief calculate the gamma lut value
:return NONE
"""
with self.mutex:
status, self.gamma_lut, self.gamma_lut_length = dx_get_gamma_lut(self.gamma_factor)
if status != DxStatus.OK:
raise UnexpectedError("dx_get_gamma_lut failure, Error code:%s" % hex(status).__str__())
def __calc_contrast_lut(self):
"""
:brief calculate the contrast lut value
:return NONE
"""
with self.mutex:
status, self.contrast_lut, self.contrast_lut_length = dx_get_contrast_lut(self.contrast_factor)
if status != DxStatus.OK:
raise UnexpectedError("__calc_contrast_lut failure, Error code:%s" % hex(status).__str__())