#!/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 .gxiapi import * from .gxidef import * from .ImageProc import * import types if sys.version_info.major > 2: INT_TYPE = int else: INT_TYPE = (int, long) class ImageFormatConvert: def __init__(self): self.alpha_value = 255 self.image_pixel_format_des = GxPixelFormatEntry.UNDEFINED self.interpolation_type = DxBayerConvertType.NEIGHBOUR self.image_convert_handle = None self.valid_bits = DxValidBit.BIT0_7 def __new__(cls, *args, **kw): return object.__new__(cls, *args) def __del__(self): if self.image_convert_handle is not None: status = dx_image_format_convert_destroy(self.image_convert_handle) if status != DxStatus.OK: raise UnexpectedError( "dx_image_format_convert_destroy failure, Error code:%s" % hex(status).__str__()) self.image_convert_handle = None def set_dest_format(self, dest_pixel_format): """ :brief set desired pixel format :param: dest_pixel_format(desired pixel format) """ if not (isinstance(dest_pixel_format, INT_TYPE)): raise ParameterTypeError("dest_pixel_format must to be GxPixelFormatEntry's element.") self.__check_handle() status = dx_image_format_convert_set_output_pixel_format(self.image_convert_handle, dest_pixel_format) if status != DxStatus.OK: raise UnexpectedError("dx_image_format_convert_set_output_pixel_format failure, Error code:%s" % hex(status).__str__()) self.image_pixel_format_des = dest_pixel_format def get_dest_format(self): """ :brief get desired pixel format :param: dest_pixel_format(desired pixel format) """ self.__check_handle() status, pixel_format = dx_image_format_convert_get_output_pixel_format(self.image_convert_handle) if status != DxStatus.OK: raise UnexpectedError("dx_image_format_convert_get_output_pixel_format failure, Error code:%s" % hex(status).__str__()) return pixel_format def set_interpolation_type(self, cvt_type): """ :brief set the conversion algorithm :param cvt_type:conversion algorithm [in] deault: DxBayerConvertType.NEIGHBOUR """ if not isinstance(cvt_type, INT_TYPE): raise ParameterTypeError("cc_type param must be int in DxRGBChannelOrder") self.__check_handle() status = dx_image_format_convert_set_interpolation_type(self.image_convert_handle, cvt_type) if status != DxStatus.OK: raise UnexpectedError("dx_image_format_convert_set_interpolation_type failure, Error code:%s" % hex(status).__str__()) self.interpolation_type = cvt_type def get_interpolation_type(self): """ :brief get the conversion algorithm """ return self.interpolation_type def set_alpha_value(self, alpha_value): """ :brief Sets the Alpha value for images with Alpha channels :param alpha_value: alpha value,range 0~255 deault 255 :return void """ if not isinstance(alpha_value, INT_TYPE): raise ParameterTypeError("alpha_value param must be int type.") self.__check_handle() if alpha_value < 0 or alpha_value > 255: raise InvalidParameter("DX_PARAMETER_OUT_OF_BOUND") status = dx_image_format_convert_set_alpha_value(self.image_convert_handle, alpha_value) if status != DxStatus.OK: raise UnexpectedError("image_format_convert_set_alpha_value failure, Error code:%s" % hex(status).__str__()) self.alpha_value = alpha_value def get_alpha_value(self): """ :brief Gets the Alpha value for images with Alpha channels """ return self.alpha_value def set_valid_bits(self, valid_bits): """ :brief Set valid Bits :param valid_bits, refer to DxValidBit :return void """ if not isinstance(valid_bits, INT_TYPE): raise ParameterTypeError("valid_bits param must be int in DxValidBit element.") self.__check_handle() status = dx_image_format_convert_set_valid_bits(self.image_convert_handle, valid_bits) if status != DxStatus.OK: raise UnexpectedError("image_format_convert_set_alpha_value failure, Error code:%s" % hex(status).__str__()) self.valid_bits = valid_bits def get_valid_bits(self): """ :brief Get valid Bits """ return self.valid_bits def get_buffer_size_for_conversion_ex(self, width, height, pixel_format): """ :brief Calculating Buffer size for conversion :param emPixelFormat [in] Pixel Format :param nImgWidth [in] Image Width :param nImgHeight [in] Image Height :return image buffer size """ if not isinstance(width, INT_TYPE): raise ParameterTypeError("width param must be int type.") if not isinstance(height, INT_TYPE): raise ParameterTypeError("height param must be int type.") if not (isinstance(pixel_format, INT_TYPE)): raise ParameterTypeError("pixel_format must to be GxPixelFormatEntry's element.") self.__check_handle() status, buffer_size_c = dx_image_format_convert_get_buffer_size_for_conversion(self.image_convert_handle, pixel_format, width, height) if status != DxStatus.OK: raise UnexpectedError("image_format_convert_get_buffer_size_for_conversion failure, Error code:%s" % hex(status).__str__()) return buffer_size_c def get_buffer_size_for_conversion(self, raw_image): """ :brief Calculating Buffer size for conversion :param raw_image.get_width [in] Image Width :param raw_image.get_height [in] Image Height :return image buffer size """ if not isinstance(raw_image, RawImage): raise ParameterTypeError("raw_image param must be RawImage type") self.__check_handle() status, buffer_size_c = dx_image_format_convert_get_buffer_size_for_conversion(self.image_convert_handle, self.image_pixel_format_des, raw_image.get_width(), raw_image.get_height()) if status != DxStatus.OK: raise UnexpectedError("image_format_convert_get_buffer_size_for_conversion failure, Error code:%s" % hex(status).__str__()) return buffer_size_c def convert_ex(self, input_address, input_width, input_height, src_fixel_format, output_address, output_length, flip): """ :brief Image Format Convert Process Supported image format conversion include 1.Bayer conversion a. input image format GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_BG8 output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_RGBA8 GX_PIXEL_FORMAT_BGRA8 GX_PIXEL_FORMAT_ARGB8 GX_PIXEL_FORMAT_ABGR8 GX_PIXEL_FORMAT_RGB8_PLANAR b. input image format GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GR14 GX_PIXEL_FORMAT_BAYER_RG14 GX_PIXEL_FORMAT_BAYER_GB14 GX_PIXEL_FORMAT_BAYER_BG14 GX_PIXEL_FORMAT_BAYER_GR16 GX_PIXEL_FORMAT_BAYER_RG16 GX_PIXEL_FORMAT_BAYER_GB16 GX_PIXEL_FORMAT_BAYER_BG16 output image format GX_PIXEL_FORMAT_MONO16 GX_PIXEL_FORMAT_RGB16 GX_PIXEL_FORMAT_BGR16 GX_PIXEL_FORMAT_RGB16_PLANAR GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BGR8 2.RGB conversion a. input image format GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BGR8 output image format GX_PIXEL_FORMAT_YUV444_8 GX_PIXEL_FORMAT_YUV422_8 GX_PIXEL_FORMAT_YUV411_8 GX_PIXEL_FORMAT_YUV420_8_PLANAR GX_PIXEL_FORMAT_YCBCR444_8 GX_PIXEL_FORMAT_YCBCR422_8 GX_PIXEL_FORMAT_YCBCR411_8 GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_RGB8 b. input image format GX_PIXEL_FORMAT_RGB16 GX_PIXEL_FORMAT_BGR16 output image format GX_PIXEL_FORMAT_MONO16 3.Packed conversion(GVSP) a. input image format GX_PIXEL_FORMAT_MONO10_PACKED GX_PIXEL_FORMAT_MONO12_PACKED GX_PIXEL_FORMAT_BAYER_RG10_PACKED GX_PIXEL_FORMAT_BAYER_GR10_PACKED GX_PIXEL_FORMAT_BAYER_BG10_PACKED GX_PIXEL_FORMAT_BAYER_GB10_PACKED GX_PIXEL_FORMAT_BAYER_RG12_PACKED GX_PIXEL_FORMAT_BAYER_GR12_PACKED GX_PIXEL_FORMAT_BAYER_BG12_PACKED GX_PIXEL_FORMAT_BAYER_GB12_PACKED output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_BG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_RGB8 4.Packed conversion(PFNC) a. input image format GX_PIXEL_FORMAT_MONO10_P GX_PIXEL_FORMAT_MONO12_P GX_PIXEL_FORMAT_MONO14_P GX_PIXEL_FORMAT_BAYER_RG10_P GX_PIXEL_FORMAT_BAYER_GR10_P GX_PIXEL_FORMAT_BAYER_BG10_P GX_PIXEL_FORMAT_BAYER_GB10_P GX_PIXEL_FORMAT_BAYER_RG12_P GX_PIXEL_FORMAT_BAYER_GR12_P GX_PIXEL_FORMAT_BAYER_BG12_P GX_PIXEL_FORMAT_BAYER_GB12_P GX_PIXEL_FORMAT_BAYER_RG14_P GX_PIXEL_FORMAT_BAYER_GR14_P GX_PIXEL_FORMAT_BAYER_BG14_P GX_PIXEL_FORMAT_BAYER_GB14_P output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_MONO14 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_BG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_BAYER_RG14 GX_PIXEL_FORMAT_BAYER_GR14 GX_PIXEL_FORMAT_BAYER_BG14 GX_PIXEL_FORMAT_BAYER_GB14 5.Mono conversion a. input image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_R8 GX_PIXEL_FORMAT_G8 GX_PIXEL_FORMAT_B8 output image format GX_PIXEL_FORMAT_RGB8 b. input image format GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_MONO14 GX_PIXEL_FORMAT_MONO16 output image format GX_PIXEL_FORMAT_RGB8 :param input_address [in] Image in :param output_length [in&out] Image out :param nOutBufferSize [in] Output Image buffer size :param src_fixel_format [in] Input Image Pixel Type :param input_width [in] Image width :param input_height [in] Image height :param flip [in] Image flip or not, true:flip false:not flip :return emStatus """ if input_address is None: raise ParameterTypeError("input_address is NULL pointer.") if output_address is None: raise ParameterTypeError("output_address is NULL pointer.") if not isinstance(input_width, INT_TYPE): raise ParameterTypeError("input_width param must be int type.") if not isinstance(input_height, INT_TYPE): raise ParameterTypeError("input_height param must be int type.") if not (isinstance(src_fixel_format, INT_TYPE)): raise ParameterTypeError("src_fixel_format must to be GxPixelFormatEntry's element.") if not (isinstance(output_length, INT_TYPE)): raise ParameterTypeError("output_length must to be int type.") if not (isinstance(flip, bool)): raise ParameterTypeError("flip must to be bool type.") self.__check_handle() input_length = self.get_buffer_size_for_conversion_ex(input_width, input_height, src_fixel_format) status = dx_image_format_convert(self.image_convert_handle, input_address, input_length, output_address, output_length, src_fixel_format, input_width, input_height, flip) if status != DxStatus.OK: raise UnexpectedError("image_format_convert failure, Error code:%s" % hex(status).__str__()) def convert(self, raw_image, output_address, output_length, flip): """ :brief Image Format Convert Process Supported image format conversion include 1.Bayer conversion a. input image format GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_BG8 output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_RGBA8 GX_PIXEL_FORMAT_BGRA8 GX_PIXEL_FORMAT_ARGB8 GX_PIXEL_FORMAT_ABGR8 GX_PIXEL_FORMAT_RGB8_PLANAR b. input image format GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GR14 GX_PIXEL_FORMAT_BAYER_RG14 GX_PIXEL_FORMAT_BAYER_GB14 GX_PIXEL_FORMAT_BAYER_BG14 GX_PIXEL_FORMAT_BAYER_GR16 GX_PIXEL_FORMAT_BAYER_RG16 GX_PIXEL_FORMAT_BAYER_GB16 GX_PIXEL_FORMAT_BAYER_BG16 output image format GX_PIXEL_FORMAT_MONO16 GX_PIXEL_FORMAT_RGB16 GX_PIXEL_FORMAT_BGR16 GX_PIXEL_FORMAT_RGB16_PLANAR GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BGR8 2.RGB conversion a. input image format GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BGR8 output image format GX_PIXEL_FORMAT_YUV444_8 GX_PIXEL_FORMAT_YUV422_8 GX_PIXEL_FORMAT_YUV411_8 GX_PIXEL_FORMAT_YUV420_8_PLANAR GX_PIXEL_FORMAT_YCBCR444_8 GX_PIXEL_FORMAT_YCBCR422_8 GX_PIXEL_FORMAT_YCBCR411_8 GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_RGB8 b. input image format GX_PIXEL_FORMAT_RGB16 GX_PIXEL_FORMAT_BGR16 output image format GX_PIXEL_FORMAT_MONO16 3.Packed conversion(GVSP) a. input image format GX_PIXEL_FORMAT_MONO10_PACKED GX_PIXEL_FORMAT_MONO12_PACKED GX_PIXEL_FORMAT_BAYER_RG10_PACKED GX_PIXEL_FORMAT_BAYER_GR10_PACKED GX_PIXEL_FORMAT_BAYER_BG10_PACKED GX_PIXEL_FORMAT_BAYER_GB10_PACKED GX_PIXEL_FORMAT_BAYER_RG12_PACKED GX_PIXEL_FORMAT_BAYER_GR12_PACKED GX_PIXEL_FORMAT_BAYER_BG12_PACKED GX_PIXEL_FORMAT_BAYER_GB12_PACKED output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_BG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_RGB8 4.Packed conversion(PFNC) a. input image format GX_PIXEL_FORMAT_MONO10_P GX_PIXEL_FORMAT_MONO12_P GX_PIXEL_FORMAT_MONO14_P GX_PIXEL_FORMAT_BAYER_RG10_P GX_PIXEL_FORMAT_BAYER_GR10_P GX_PIXEL_FORMAT_BAYER_BG10_P GX_PIXEL_FORMAT_BAYER_GB10_P GX_PIXEL_FORMAT_BAYER_RG12_P GX_PIXEL_FORMAT_BAYER_GR12_P GX_PIXEL_FORMAT_BAYER_BG12_P GX_PIXEL_FORMAT_BAYER_GB12_P GX_PIXEL_FORMAT_BAYER_RG14_P GX_PIXEL_FORMAT_BAYER_GR14_P GX_PIXEL_FORMAT_BAYER_BG14_P GX_PIXEL_FORMAT_BAYER_GB14_P output image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_MONO14 GX_PIXEL_FORMAT_RGB8 GX_PIXEL_FORMAT_BAYER_RG8 GX_PIXEL_FORMAT_BAYER_GR8 GX_PIXEL_FORMAT_BAYER_BG8 GX_PIXEL_FORMAT_BAYER_GB8 GX_PIXEL_FORMAT_BAYER_RG10 GX_PIXEL_FORMAT_BAYER_GR10 GX_PIXEL_FORMAT_BAYER_BG10 GX_PIXEL_FORMAT_BAYER_GB10 GX_PIXEL_FORMAT_BAYER_RG12 GX_PIXEL_FORMAT_BAYER_GR12 GX_PIXEL_FORMAT_BAYER_BG12 GX_PIXEL_FORMAT_BAYER_GB12 GX_PIXEL_FORMAT_BAYER_RG14 GX_PIXEL_FORMAT_BAYER_GR14 GX_PIXEL_FORMAT_BAYER_BG14 GX_PIXEL_FORMAT_BAYER_GB14 5.Mono conversion a. input image format GX_PIXEL_FORMAT_MONO8 GX_PIXEL_FORMAT_R8 GX_PIXEL_FORMAT_G8 GX_PIXEL_FORMAT_B8 output image format GX_PIXEL_FORMAT_RGB8 b. input image format GX_PIXEL_FORMAT_MONO10 GX_PIXEL_FORMAT_MONO12 GX_PIXEL_FORMAT_MONO14 GX_PIXEL_FORMAT_MONO16 output image format GX_PIXEL_FORMAT_RGB8 :param raw_image [in] Image in :param output_length [in&out] Image out :param nOutBufferSize [in] Output Image buffer size :param flip [in] Image flip or not, true:flip false:not flip :return emStatus """ if not isinstance(raw_image, RawImage): raise ParameterTypeError("raw_image param must be RawImage type") if raw_image.frame_data.image_buf is None: raise ParameterTypeError("raw_image.frame_data.image_buf is NULL pointer") if output_address is None: raise ParameterTypeError("output_address is NULL pointer") if not isinstance(output_length, INT_TYPE): raise ParameterTypeError("output_length param must be int type.") if not (isinstance(flip, bool)): raise ParameterTypeError("flip must to be bool type.") self.__check_handle() input_length = self.get_buffer_size_for_conversion_ex(raw_image.get_width(), raw_image.get_height(), raw_image.get_pixel_format()) status = dx_image_format_convert(self.image_convert_handle, raw_image.frame_data.image_buf, input_length, output_address, output_length, raw_image.get_pixel_format(), raw_image.get_width(), raw_image.get_height(), flip) if status != DxStatus.OK: raise UnexpectedError("image_format_convert failure, Error code:%s" % hex(status).__str__()) def __check_handle(self): """ :brief The transformation handle is initialized the first time it is called :return NONE """ if self.image_convert_handle is None: status, handle = dx_image_format_convert_create() if status != DxStatus.OK: raise UnexpectedError("dx_image_format_convert_create failure, Error code:%s" % hex(status).__str__()) self.image_convert_handle = handle