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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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__())