同步操作将从 yxgy/samples 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
"""Copyright (R) @huawei.com, all rights reserved-*- coding:utf-8 -*-CREATED: 2021年01月20日 20:12:13MODIFIED: 2021年01月29日 14:04:45"""import numpy as npimport aclimport acllite_utils as utilsfrom acllite_image import AclLiteImagefrom acllite_logger import log_error, log_infofrom acllite_resource import resource_listimport constants as constantsclass AclLiteImageProc(object):"""dvpp class"""def __init__(self, acl_resource=None):if acl_resource is None:self._stream, ret = acl.rt.create_stream()utils.check_ret("acl.rt.create_stream", ret)self._run_mode, ret = acl.rt.get_run_mode()utils.check_ret("acl.rt.get_run_mode", ret)else:self._stream = acl_resource.streamself._run_mode = acl_resource.run_modeself._dvpp_channel_desc = Noneself._crop_config = Noneself._paste_config = Noneself._init_resource()# AclLiteImageProc involves acl resources, which need to be released \# before the acl ends when the program exits, \# register here to the resource table to ensure the release timingself._is_destroyed = Falseresource_list.register(self)def _init_resource(self):# Create dvpp channelself._dvpp_channel_desc = acl.media.dvpp_create_channel_desc()ret = acl.media.dvpp_create_channel(self._dvpp_channel_desc)utils.check_ret("acl.media.dvpp_create_channel", ret)# Create a resize configurationself._resize_config = acl.media.dvpp_create_resize_config()# Create yuv to jpeg configurationself._jpege_config = acl.media.dvpp_create_jpege_config()ret = acl.media.dvpp_set_jpege_config_level(self._jpege_config, 100)utils.check_ret("acl.media.dvpp_set_jpege_config_level", ret)def _gen_input_pic_desc(self, image,width_align_factor=16, height_align_factor=2):# Create input imageif image.align_width == 0 and image.align_height == 0:image.align_width = utils.align_up(image.width, width_align_factor)image.align_height = utils.align_up(image.height, height_align_factor)pic_desc = acl.media.dvpp_create_pic_desc()acl.media.dvpp_set_pic_desc_data(pic_desc, image.data())acl.media.dvpp_set_pic_desc_format(pic_desc, constants.PIXEL_FORMAT_YUV_SEMIPLANAR_420)acl.media.dvpp_set_pic_desc_width(pic_desc, image.width)acl.media.dvpp_set_pic_desc_height(pic_desc, image.height)acl.media.dvpp_set_pic_desc_width_stride(pic_desc, image.align_width)acl.media.dvpp_set_pic_desc_height_stride(pic_desc, image.align_height)acl.media.dvpp_set_pic_desc_size(pic_desc, image.size)return pic_descdef _gen_output_pic_desc(self, width, height,output_buffer, output_buffer_size,width_align_factor=16, height_align_factor=2):# Create output imagestride_width = utils.align_up(width, width_align_factor)stride_height = utils.align_up(height, height_align_factor)pic_desc = acl.media.dvpp_create_pic_desc()acl.media.dvpp_set_pic_desc_data(pic_desc, output_buffer)acl.media.dvpp_set_pic_desc_format(pic_desc, constants.PIXEL_FORMAT_YUV_SEMIPLANAR_420)acl.media.dvpp_set_pic_desc_width(pic_desc, width)acl.media.dvpp_set_pic_desc_height(pic_desc, height)acl.media.dvpp_set_pic_desc_width_stride(pic_desc, stride_width)acl.media.dvpp_set_pic_desc_height_stride(pic_desc, stride_height)acl.media.dvpp_set_pic_desc_size(pic_desc, output_buffer_size)return pic_descdef _stride_yuv_size(self, width, height,width_align_factor=16, height_align_factor=2):stride_width = utils.align_up(width, width_align_factor)stride_height = utils.align_up(height, height_align_factor)stride_size = utils.yuv420sp_size(stride_width, stride_height)return stride_width, stride_height, stride_sizedef jpegd(self, image):"""jepg image to yuv image"""soc_version = acl.get_soc_name()if soc_version == "Ascend310P3":image.width = utils.align_up2(image.width)image.height = utils.align_up2(image.height)stride_width = utils.align_up64(image.width)stride_height = utils.align_up16(image.height)stride_size = utils.yuv420sp_size(stride_width, stride_height)else:stride_width = utils.align_up128(image.width)stride_height = utils.align_up16(image.height)stride_size = utils.yuv420sp_size(stride_width, stride_height)# Create conversion output image descoutput_desc, out_buffer = self._gen_jpegd_out_pic_desc(image, stride_size)ret = acl.media.dvpp_jpeg_decode_async(self._dvpp_channel_desc,image.data(),image.size,output_desc,self._stream)if ret != constants.ACL_SUCCESS:log_error("dvpp_jpeg_decode_async failed ret={}".format(ret))return Noneret = acl.rt.synchronize_stream(self._stream)if ret != constants.ACL_SUCCESS:log_error("dvpp_jpeg_decode_async failed ret={}".format(ret))return None# Return the decoded AclLiteImage instancereturn AclLiteImage(out_buffer, image.width, image.height, stride_width,stride_height, stride_size, constants.MEMORY_DVPP)def _gen_jpegd_out_pic_desc(self, image, stride_size):# Predict the memory size required to decode jpeg into yuv picturesret, out_buffer_size = self._get_jpegd_memory_size(image, stride_size)if not ret:return None# Apply for memory for storing decoded yuv picturesout_buffer, ret = acl.media.dvpp_malloc(out_buffer_size)if ret != constants.ACL_SUCCESS:log_error("AclLiteImageProc malloc failed, error: ", ret)return None# Create output image descpic_desc = self._gen_output_pic_desc(image.width,image.height,out_buffer,out_buffer_size,width_align_factor=128,height_align_factor=16)return pic_desc, out_bufferdef _get_jpegd_memory_size(self, image, stride_size):if image.is_local():size, ret = acl.media.dvpp_jpeg_predict_dec_size(image.data(), image.size, constants.PIXEL_FORMAT_YUV_SEMIPLANAR_420)if ret != constants.ACL_SUCCESS:log_error("Predict jpeg decode size failed, return ", ret)return False, 0return True, sizeelse:return True, int(stride_size)def resize(self, image, resize_width, resize_height):"""Scale yuvsp420 picture to specified size"""# Generate input picture descinput_desc = self._gen_input_pic_desc(image)# Calculate the image size after scalingstride_width = utils.align_up16(resize_width)stride_height = utils.align_up2(resize_height)output_size = utils.yuv420sp_size(stride_width, stride_height)# Request memory for the zoomed pictureout_buffer, ret = acl.media.dvpp_malloc(output_size)if ret != constants.ACL_SUCCESS:log_error("AclLiteImageProc malloc failed, error: ", ret)return None# Create output imageoutput_desc = self._gen_output_pic_desc(resize_width, resize_height,out_buffer, output_size)if output_desc is None:log_error("Gen resize output desc failed")return None# Call dvpp asynchronous zoom interface to zoom picturesret = acl.media.dvpp_vpc_resize_async(self._dvpp_channel_desc,input_desc,output_desc,self._resize_config,self._stream)if ret != constants.ACL_SUCCESS:log_error("Vpc resize async failed, error: ", ret)return None# Wait for the zoom operation to completeret = acl.rt.synchronize_stream(self._stream)if ret != constants.ACL_SUCCESS:log_error("Resize synchronize stream failed, error: ", ret)return None# Release the resources requested for scalingacl.media.dvpp_destroy_pic_desc(input_desc)acl.media.dvpp_destroy_pic_desc(output_desc)return AclLiteImage(out_buffer, resize_width, resize_height, stride_width,stride_height, output_size, constants.MEMORY_DVPP)def _gen_resize_out_pic_desc(self, resize_width,resize_height, output_size):out_buffer, ret = acl.media.dvpp_malloc(output_size)if ret != constants.ACL_SUCCESS:log_error("AclLiteImageProc malloc failed, error: ", ret)return Nonepic_desc = self._gen_output_pic_desc(resize_width, resize_height,out_buffer, output_size)return pic_desc, out_bufferdef crop_and_paste(self,image,width,height,crop_and_paste_width,crop_and_paste_height):"""crop_and_paste"""log_info('AclLiteImageProc vpc crop and paste stage:')input_desc = self._gen_input_pic_desc(image)stride_width = utils.align_up16(crop_and_paste_width)stride_height = utils.align_up2(crop_and_paste_height)out_buffer_size = utils.yuv420sp_size(stride_width, stride_height)out_buffer, ret = acl.media.dvpp_malloc(out_buffer_size)output_desc = self._gen_output_pic_desc(crop_and_paste_width,crop_and_paste_height,out_buffer,out_buffer_size)self._crop_config = acl.media.dvpp_create_roi_config(0, (width >> 1 << 1) - 1, 0, (height >> 1 << 1) - 1)# set crop area:rx = float(width) / float(crop_and_paste_width)ry = float(height) / float(crop_and_paste_height)if rx > ry:dx = 0r = rxdy = int((crop_and_paste_height - height / r) / 2)else:dy = 0r = rydx = int((crop_and_paste_width - width / r) / 2)pasteRightOffset = int(crop_and_paste_width - 2 * dx)pasteBottomOffset = int(crop_and_paste_height - 2 * dy)if (pasteRightOffset % 2) == 0:pasteRightOffset = pasteRightOffset - 1if (pasteBottomOffset % 2) == 0:pasteBottomOffset = pasteBottomOffset - 1self._paste_config = acl.media.dvpp_create_roi_config(0, pasteRightOffset, 0, pasteBottomOffset)ret = acl.media.dvpp_vpc_crop_and_paste_async(self._dvpp_channel_desc,input_desc,output_desc,self._crop_config,self._paste_config,self._stream)utils.check_ret("acl.media.dvpp_vpc_crop_and_paste_async", ret)ret = acl.rt.synchronize_stream(self._stream)utils.check_ret("acl.rt.synchronize_stream", ret)log_info('AclLiteImageProc vpc crop and paste stage success')stride_width = crop_and_paste_width - 2 * dxstride_height = crop_and_paste_height - 2 * dyacl.media.dvpp_destroy_pic_desc(input_desc)acl.media.dvpp_destroy_pic_desc(output_desc)return AclLiteImage(out_buffer, image.width, image.height, stride_width,stride_height, out_buffer_size, constants.MEMORY_DVPP)def crop_and_paste_get_roi(self,image,width,height,crop_and_paste_width,crop_and_paste_height):""":image: input image:width: input image width:height: input image height:crop_and_paste_width: crop_and_paste_width:crop_and_paste_height: crop_and_paste_height:return: return AclLiteImage"""log_info('AclLiteImageProc vpc crop and paste stage:')input_desc = self._gen_input_pic_desc(image)stride_width = utils.align_up16(crop_and_paste_width)stride_height = utils.align_up2(crop_and_paste_height)out_buffer_size = utils.yuv420sp_size(stride_width, stride_height)out_buffer, ret = acl.media.dvpp_malloc(out_buffer_size)output_desc = self._gen_output_pic_desc(crop_and_paste_width,crop_and_paste_height,out_buffer,out_buffer_size)self._crop_config = acl.media.dvpp_create_roi_config(0, (width >> 1 << 1) - 1, 0, (height >> 1 << 1) - 1)self._paste_config = acl.media.dvpp_create_roi_config(0, crop_and_paste_width - 1, 0, crop_and_paste_height - 1)ret = acl.media.dvpp_vpc_crop_and_paste_async(self._dvpp_channel_desc,input_desc,output_desc,self._crop_config,self._paste_config,self._stream)utils.check_ret("acl.media.dvpp_vpc_crop_and_paste_async", ret)ret = acl.rt.synchronize_stream(self._stream)utils.check_ret("acl.rt.synchronize_stream", ret)log_info('AclLiteImageProc vpc crop and paste stage success')stride_width = utils.align_up16(crop_and_paste_width)stride_height = utils.align_up2(crop_and_paste_height)acl.media.dvpp_destroy_pic_desc(input_desc)acl.media.dvpp_destroy_pic_desc(output_desc)return AclLiteImage(out_buffer, image.width, image.height, stride_width,stride_height, out_buffer_size, constants.MEMORY_DVPP)def jpege(self, image):"""Convert yuv420sp pictures to jpeg pictures"""# create input imageinput_desc = self._gen_input_pic_desc(image)# Predict the memory size required for conversionoutput_size, ret = acl.media.dvpp_jpeg_predict_enc_size(input_desc, self._jpege_config)if (ret != constants.ACL_SUCCESS):log_error("Predict jpege output size failed")return None# Request memory required for conversionoutput_buffer, ret = acl.media.dvpp_malloc(output_size)if (ret != constants.ACL_SUCCESS):log_error("Malloc jpege output memory failed")return Noneoutput_size_array = np.array([output_size], dtype=np.int32)if "bytes_to_ptr" in dir(acl.util):bytes_data = output_size_array.tobytes()output_size_ptr = acl.util.bytes_to_ptr(bytes_data)else:output_size_ptr = acl.util.numpy_to_ptr(output_size_array)# Call jpege asynchronous interface to convert picturesret = acl.media.dvpp_jpeg_encode_async(self._dvpp_channel_desc,input_desc, output_buffer,output_size_ptr,self._jpege_config,self._stream)if (ret != constants.ACL_SUCCESS):log_error("Jpege failed, ret ", ret)return None# Wait for the conversion to completeret = acl.rt.synchronize_stream(self._stream)if (ret != constants.ACL_SUCCESS):log_error("Jpege synchronize stream, failed, ret ", ret)return None# Release resourcesacl.media.dvpp_destroy_pic_desc(input_desc)if "bytes_to_ptr" in dir(acl.util):output_size_array=np.frombuffer(bytes_data,dtype=output_size_array.dtype).reshape(output_size_array.shape)return AclLiteImage(output_buffer, image.width, image.height, 0, 0, int(output_size_array[0]), constants.MEMORY_DVPP)def destroy(self):"""dvpp resource release"""if self._is_destroyed:returnif self._resize_config:acl.media.dvpp_destroy_resize_config(self._resize_config)if self._dvpp_channel_desc:acl.media.dvpp_destroy_channel(self._dvpp_channel_desc)acl.media.dvpp_destroy_channel_desc(self._dvpp_channel_desc)if self._jpege_config:acl.media.dvpp_destroy_jpege_config(self._jpege_config)self._is_destroyed = Trueresource_list.unregister(self)log_info("dvpp resource release success")def __del__(self):self.destroy()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。