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.

365 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 .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_typeconversion 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