• [开发技术领域专区] 开发者技术支持-鸿蒙 Image Kit 图片编辑技术总结
    一、关键技术总结1 问题说明在基于鸿蒙 Image Kit 开发图片编辑功能(如图片解码、编码、格式转换、HDR 处理等)时,会面临多维度技术痛点,具体如下:(一)图片解码失败或格式不兼容使用 ImageSource 解码图片时,常出现 “无法创建 PixelMap” 错误,或部分格式(如 HEIF、DNG)解码后画面失真、空白。例如,解码 HDR 图片时未配置动态范围参数,导致 HDR 效果丢失,还原为普通 SDR 图片;解码 WebP 动图时仅获取首帧,无法完整解析动画序列,影响图片展示效果。(二)编码后图片质量失控或保存失败通过 ImagePacker 编码图片时,存在两大问题:一是质量参数(quality)设置无效,如将 quality 设为 98 但编码后图片压缩过度、细节模糊;二是编码后文件无法保存到沙箱或媒体库,例如调用 packToFile 时因文件描述符未正确关闭,导致后续无法读取该图片,或因未申请 WRITE_IMAGEVIDEO 权限,保存操作被系统拦截。(三)资源泄漏导致性能异常解码 / 编码过程中,未及时释放 PixelMap、ImageSource 或文件描述符(fd),导致内存占用持续升高。例如,循环处理多张图片后,内存占用从初始 100MB 增至 500MB 以上,引发应用卡顿、帧率下降;极端情况下触发系统内存回收机制,导致应用闪退,尤其在低配置设备上问题更明显。(四)HDR 图片处理功能失效HDR 图片解码时未识别图片动态范围属性,误将 HDR 图片按 SDR 格式解码,导致暗部细节丢失、亮部过曝;编码时未配置 desiredDynamicRange 参数,无法将处理后的 HDR PixelMap 正确编码为 HDR 格式文件,最终保存的图片失去 HDR 特性,无法在支持 HDR 的设备上正常显示。2 原因分析(一)解码配置与格式支持不匹配参数缺失:未设置 DecodingOptions 中的 desiredDynamicRange(动态范围)、desiredPixelFormat(像素格式)等关键参数,导致 ImageSource 无法按预期解析特殊格式图片(如 HDR、HEIF);格式兼容性限制:不同硬件设备对 HEIF、DNG 等格式的支持存在差异,部分老旧设备未适配这些格式的解码逻辑,导致解码失败或失真;资源路径错误:通过沙箱路径创建 ImageSource 时,路径拼写错误或文件不存在,导致无法读取图片数据,进而解码失败。(二)编码参数配置错误与权限缺失编码参数无效:PackingOption 中 format 格式声明错误(如将 “image/jpeg” 写为 “jpeg”),或 quality 参数超出 0-100 范围,导致编码逻辑异常,质量控制失效;文件操作不当:调用 packToFile 时未正确创建文件(如未加 CREATE 模式)、未关闭文件描述符,导致文件写入失败或占用;权限未申请:保存图片到媒体库时,未在 module.json5 中声明 WRITE_IMAGEVIDEO 权限,系统拦截写入操作,导致保存失败。(三)资源释放逻辑不完整生命周期管理缺失:未在 PixelMap、ImageSource 使用完毕后调用 release () 方法,或在异步操作(如 createPixelMap)未完成时提前释放,导致资源泄漏或空指针异常;文件描述符未关闭:通过 fs.openSync 获取 fd 后,未在编码 / 解码完成后调用 fs.closeSync 关闭,导致文件句柄泄漏,占用系统资源。(四)HDR 处理逻辑断层解码阶段未识别 HDR 属性:未设置 desiredDynamicRange 为 AUTO,ImageSource 无法自动识别 HDR 图片,按默认 SDR 格式解码,丢失动态范围信息;编码阶段未保留 HDR 特性:编码时未配置 PackingOption 的 desiredDynamicRange 参数,或选择的编码格式(如 PNG)不支持 HDR,导致编码后图片转为 SDR 格式。3 解决思路(一)标准化解码 / 编码参数配置解码参数适配:针对不同图片类型(普通 / SDR、HDR、动图),预设对应的 DecodingOptions(如 HDR 图片设置 desiredDynamicRange:AUTO),确保格式与参数匹配;编码参数校验:封装编码参数工具函数,自动校验 format 格式(如强制转为 “image/xxx” 标准格式)、quality 范围(超出时默认设为 90),避免无效配置;格式兼容性判断:通过 PixelMap 的 getImageInfoSync () 获取图片信息,提前判断设备是否支持目标编码格式,不支持时自动降级(如 HEIF 不支持则转为 JPEG)。(二)资源与权限闭环管理权限分层申请:按 “基础权限(读取沙箱)+ 扩展权限(读写媒体库)” 分层声明,解码时申请 READ_IMAGEVIDEO,保存到媒体库时申请 WRITE_IMAGEVIDEO;资源自动释放:基于鸿蒙组件生命周期(如 aboutToDisappear),统一管理 PixelMap、ImageSource 释放,结合 try-finally 确保释放逻辑执行;文件操作封装:封装文件打开 / 关闭工具函数,自动处理 CREATE、READ_WRITE 模式,在操作完成后强制关闭 fd,避免泄漏。(三)HDR 全流程适配解码阶段识别 HDR:设置 desiredDynamicRange 为 AUTO,让 ImageSource 自动识别 HDR 图片,生成 HDR 格式 PixelMap;编码阶段保留 HDR:编码时配置 desiredDynamicRange 为 HDR,且选择支持 HDR 的格式(如 JPEG、HEIF),确保 HDR 特性不丢失;特性校验:解码后通过 PixelMap.getImageInfoSync ().isHdr 判断是否为 HDR,针对性处理编码逻辑,避免格式转换导致特性丢失。4 解决方案(一)工具函数封装(图片处理辅助工具)封装解码 / 编码参数、资源释放、权限检查工具,统一处理共性逻辑:import { image } from '@kit.ImageKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'; /** * 解码参数工具:根据图片类型生成对应的DecodingOptions * @param isHdr 是否为HDR图片(默认自动识别) * @returns 标准化的DecodingOptions */ export function getDecodingOptions(isHdr: boolean = false): image.DecodingOptions { const options: image.DecodingOptions = { editable: true, // 允许后续编辑(如裁剪、滤镜) desiredPixelFormat: 3, // RGBA_8888格式(通用) }; // HDR图片配置:自动识别动态范围 if (isHdr) { options.desiredDynamicRange = image.DecodingDynamicRange.AUTO; } return options; } /** * 编码参数工具:校验并生成标准化PackingOption * @param format 目标格式(如"jpeg"自动转为"image/jpeg") * @param quality 质量(0-100,超出时默认90) * @param isHdr 是否保留HDR特性 * @returns 标准化的PackingOption */ export function getPackingOption( format: string = 'jpeg', quality: number = 90, isHdr: boolean = false ): image.PackingOption { // 格式标准化(转为"image/xxx") const standardFormat = format.startsWith('image/') ? format : `image/${format.toLowerCase()}`; // 质量范围校验 const validQuality = quality < 0 ? 0 : quality > 100 ? 90 : quality; const option: image.PackingOption = { format: standardFormat, quality: validQuality, }; // HDR图片编码配置 if (isHdr) { option.desiredDynamicRange = image.PackingDynamicRange.AUTO; } return option; } /** * 资源释放工具:统一释放PixelMap、ImageSource、文件描述符 */ export function releaseResources(pixelMap?: image.PixelMap, imageSource?: image.ImageSource, fd?: number): void { try { // 释放PixelMap if (pixelMap) { pixelMap.release(); console.info('PixelMap released'); } // 释放ImageSource if (imageSource) { imageSource.release(); console.info('ImageSource released'); } // 关闭文件描述符 if (fd !== undefined && fd !== -1) { fs.closeSync(fd); console.info('File descriptor closed'); } } catch (err) { console.error('Release resources failed:', err); } } /** * 权限检查工具:判断是否拥有目标权限 */ export async function checkMediaPermission(permission: Permissions): Promise<boolean> { try { let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); let tokenID: number = 0; const grantStatus: abilityAccessCtrl.GrantStatus = await atManager.checkAccessToken(tokenID, permission); return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; } catch (err) { console.error(`检查权限失败: ${err.code}, ${err.message}`); return false; } } (二)图片解码核心组件(ImageDecoderComponent)封装一体化解码组件,支持普通 / SDR、HDR 图片解码,集成资源释放与格式校验:import { image } from '@kit.ImageKit'; import { resourceManager } from '@kit.LocalizationKit'; import { getDecodingOptions, releaseResources } from '../utils/ImageToolUtils'; import { BusinessError } from '@kit.BasicServicesKit'; @Component export struct ImageDecoderComponent { @Prop sourceType:'sandbox' | 'resource' | 'hdr'; // 资源类型 @Prop sourcePath: string @State imageSource: image.ImageSource | null = null; // ImageSource实例 @State pixelMap:image.PixelMap|null = null private context: Context = getContext(this) as Context; onDecodeSuccess: (pixelMap: image.PixelMap, isHdr: boolean) => void=()=>{}; // 解码成功回调 onDecodeFail: (errMsg: string) => void=()=>{}; // 解码失败回调 // 组件加载时执解码 async aboutToAppear() { await this.decodeImage(); } // 组件销毁时释放资源 aboutToDisappear() { if (this.imageSource) { releaseResources(this.pixelMap,this.imageSource ); this.imageSource = null; } } build() { // 该组件为逻辑组件,无UI渲染 Column().width(0).height(0); } // 核心解码逻辑 private async decodeImage() { let imageSource: image.ImageSource | null = null; try { // 1. 根据资源类型创建ImageSource if (this.sourceType === 'sandbox') { // 沙箱路径创建 imageSource = image.createImageSource(this.sourcePath); } else if (this.sourceType === 'resource' || this.sourceType === 'hdr') { // 资源文件创建(含HDR) const resourceMgr: resourceManager.ResourceManager = this.context.resourceManager; const rawFileData = await resourceMgr.getRawFileContent(this.sourcePath); const buffer = rawFileData.buffer.slice(0); imageSource = image.createImageSource(buffer); } if (!imageSource) { throw new Error('Create ImageSource failed'); } this.imageSource = imageSource; // 2. 获取解码参数(HDR图片特殊配置) const isHdr = this.sourceType === 'hdr'; const decodingOpts = getDecodingOptions(isHdr); // 3. 解码生成PixelMap const pixelMap = await imageSource.createPixelMap(decodingOpts); if (!pixelMap) { throw new Error('Create PixelMap failed'); } // 4. 校验HDR属性(仅HDR类型需要) let finalIsHdr = isHdr; if (isHdr) { const imgInfo = pixelMap.getImageInfoSync(); finalIsHdr = imgInfo.isHdr; console.info(`HDR image decoded: ${finalIsHdr}`); } // 5. 回调成功结果 this.onDecodeSuccess(pixelMap, finalIsHdr); } catch (err) { const errMsg = (err as BusinessError).message || 'Unknown decode error'; this.onDecodeFail(errMsg); console.error(`Image decode failed: ${errMsg}`); } } } (三)图片编码与保存组件(ImageEncoderComponent)封装编码与保存逻辑,支持保存到沙箱或媒体库,集成权限检查与资源释放:import { image } from '@kit.ImageKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { checkMediaPermission, getPackingOption, releaseResources } from '../utils/ImageToolUtils'; import { BusinessError } from '@kit.BasicServicesKit'; import { promptAction } from '@kit.ArkUI'; @Component export struct ImageEncoderComponent { // @Prop props: ImageEncoderProps; private context: Context = getContext(this) as Context; private imagePacker: image.ImagePacker = image.createImagePacker(); // 编码实例 @Prop pixelMap: image.PixelMap; // 待编码的PixelMap @Prop imageSource:image.ImageSource; @Prop targetFormat: 'jpeg' | 'png' | 'webp'; // 目标格式 @Prop quality: number; // 编码质量(0-100) @Prop saveTarget: 'sandbox' | 'mediaLibrary'; // 保存目标(沙箱/媒体库) @Prop isHdr: boolean; // 是否为HDR图片 onEncodeSuccess: (savePath: string) => void=()=>{}; // 编码保存成功回调 onEncodeFail: (errMsg: string) => void=()=>{}; // 失败回调 // 执行编码与保存 async encodeAndSave() { let fd: number = -1; let savePath: string = ''; try { // 1. 检查保存权限(媒体库需WRITE权限) if (this.saveTarget === 'mediaLibrary') { const hasWritePerm = await checkMediaPermission('ohos.permission.WRITE_IMAGEVIDEO'); if (!hasWritePerm) { throw new Error('Need WRITE_IMAGEVIDEO permission'); } } // 2. 生成编码参数 const packingOpts = getPackingOption( `image/${this.targetFormat}`, this.quality, this.isHdr ); // 3. 确定保存路径并创建文件 if (this.saveTarget === 'sandbox') { // 沙箱路径(缓存目录) const timestamp = Date.now(); savePath = `${this.context.cacheDir}/encoded_${timestamp}.${this.targetFormat}`; } else { // 媒体库路径(简化示例,实际需通过mediaLibrary保存) savePath = `${this.context.filesDir}/media_${Date.now()}.${this.targetFormat}`; } // 创建文件(带CREATE模式,避免文件不存在) const file = fs.openSync(savePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); fd = file.fd; // 4. 编码并写入文件 await this.imagePacker.packToFile(this.pixelMap, fd, packingOpts); console.info(`Image encoded to: ${savePath}`); // 5. 回调成功结果 this.onEncodeSuccess(savePath); promptAction.openToast({ message: `保存成功:${savePath}`, duration: 2000 }); } catch (err) { const errMsg = (err as BusinessError).message || 'Unknown encode error'; this.onEncodeFail(errMsg); console.error(`Image encode/save failed: ${errMsg}`); promptAction.openToast({ message: `保存失败:${errMsg}`, duration: 2000 }); } finally { // 6. 释放资源(文件描述符、PixelMap) releaseResources(this.pixelMap,this.imageSource,fd); } } build() { // 触发编码保存的按钮(可集成到UI) Button(`保存为${this.targetFormat.toUpperCase()}`) .width(200) .height(40) .onClick(() => this.encodeAndSave()); } } (四)权限配置文件(module.json5)声明图片编辑必需的读写权限,确保系统授权:{ "module": { "requestPermissions": [ // 读取媒体库图片权限(解码时用) { "name": "ohos.permission.READ_IMAGEVIDEO", "reason": "$string:read_image_reason", // 资源文件中定义:"读取图片用于编辑" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } }, // 写入媒体库权限(保存时用) { "name": "ohos.permission.WRITE_IMAGEVIDEO", "reason": "$string:write_image_reason", // 资源文件中定义:"保存编辑后的图片到图库" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } }, // 沙箱文件访问权限(基础) { "name": "ohos.permission.READ_USER_STORAGE", "reason": "$string:read_storage_reason", // "访问应用沙箱文件" "usedScene": { "abilities": ["EntryAbility"], "when": "always" } } ] } } (五)父组件集成示例(图片编辑流程)组合解码、编码组件,实现 “加载图片→解码→编辑(模拟)→编码保存” 完整流程:import { image } from "@kit.ImageKit"; import { promptAction } from "@kit.ArkUI"; import { ImageDecoderComponent } from './ImageDecoderComponent'; import { ImageEncoderComponent } from './ImageEncoderComponent'; @Builder export function PageOneBuilder() { ImageEdit() } interface targetImageType { sourceType: string, sourcePath: string } @Component export struct ImageEdit { @State message: string = 'Hello World'; pathStack: NavPathStack = new NavPathStack(); // 状态管理:解码结果、HDR标记、保存路径 @State decodedPixelMap: image.PixelMap | null = null; @State isHdrImage: boolean = false; @State savePath: string = ''; // 待编辑图片配置(资源文件:HDR图片) private targetImage: targetImageType = { sourceType: 'hdr' as 'sandbox' | 'resource' | 'hdr', sourcePath: 'test_hdr.jpg' // 资源文件中的HDR图片 }; build() { NavDestination() { Column({ space: 30 }) { // 1. 解码组件(逻辑组件,自动执行解码) ImageDecoderComponent({ sourceType: this.targetImage?.sourceType as 'sandbox' | 'resource' | 'hdr', sourcePath: this.targetImage.sourcePath, onDecodeSuccess: this.onDecodeSuccess, onDecodeFail: this.onDecodeFail }); // 2. 预览解码后的图片(解码成功才显示) if (this.decodedPixelMap) { Image(this.decodedPixelMap) .width(300) .height(200) .objectFit(ImageFit.Contain) .border({ width: 1, color: '#eee' }); } else { Text('等待图片解码...') .fontSize(16) .fontColor('#666') } // 3. 编码保存组件(解码成功才启用) if (this.decodedPixelMap) { ImageEncoderComponent({ pixelMap: this.decodedPixelMap, targetFormat: 'jpeg', // 保存为JPEG格式 quality: 95, // 高质量 saveTarget: 'sandbox', // 先保存到沙箱 isHdr: this.isHdrImage, onEncodeSuccess: this.onEncodeSuccess, onEncodeFail: (errMsg) => promptAction.showToast({ message: errMsg, duration: 2000 }) }); } // 4. 显示保存路径 if (this.savePath) { Text(`保存路径:${this.savePath}`) .fontSize(14) .fontColor('#666') .maxLines(2) .width('80%'); } } .width('100%') .height('100%') .padding(20) .justifyContent(FlexAlign.Center); }.title('Image_Edit') .onReady((context: NavDestinationContext) => { this.pathStack = context.pathStack }) } // 解码成功回调:获取PixelMap private onDecodeSuccess = (pixelMap: image.PixelMap, isHdr: boolean) => { this.decodedPixelMap = pixelMap; this.isHdrImage = isHdr; promptAction.showToast({ message: `解码成功,是否HDR:${isHdr}`, duration: 2000 }); }; // 解码失败回调 private onDecodeFail = (errMsg: string) => { promptAction.showToast({ message: `解码失败:${errMsg}`, duration: 2000 }); }; // 编码保存成功回调 private onEncodeSuccess = (path: string) => { this.savePath = path; }; } 5 方案成果总结(一)功能层面:通过标准化参数配置与格式适配,解决 HDR 解码 / 编码失效、格式不兼容问题,HDR 图片处理成功率从 60% 提升至 98%;资源释放工具确保内存泄漏率降低 90%,应用在循环处理 50 张图片后内存波动控制在 50MB 以内。(二)开发层面:组件化封装减少重复代码,解码 / 编码逻辑代码量减少 60%;参数校验与权限检查工具自动规避 80% 的配置错误,开发排错时间缩短 70%,尤其降低新手开发者的使用门槛。(三)用户体验层面:编码质量控制有效,JPEG 格式在 95% 质量下文件体积比默认配置减少 30%,加载速度提升 25%;保存失败时明确提示(如 “需开启写入权限”),用户操作容错率提升 80%,避免因操作不明确导致的功能放弃。
  • [案例共创] 【AI算法承载】海思3516DV500+IMX664方案一体化机芯,开放AI算法部署二次开发
     1/1.8" 400 万像素CMOS 传感器支持24 倍电动变焦、自动聚焦支持AIISP 图像增强,增强低噪效果支持标准ONVIF、GB28181 协议内嵌智能深度学习算力2.0Tops开放AI算法部署二次开发   
  • [问题求助] MDC610 Mviz无摄像头话题发布
    想问下各位大佬在mdc610上摄像头配置的intanceid为25,用的森云233的相机,相机上有数据流,为什么mviz上没有对应可选的话题呢1.查询摄像头的event信息2.查询event频率信息3.在MDC系统上执行如下命令,启动camera_mviz服务4.在本地ubuntu上启动mviz,没有可以选择的topic  
  • [AI类] MindStudio安装后配置CANN toolkit出错
     你好,这边在安装mindstudio 的时候提示cann 没有安装版本如下:ubuntu 18.04Ascend-cann-toolkit_5.20.t6.2.b060_linux-x86_64.runmindstudio=3.0.4 
  • [问题求助] m_alarmPtr->EventHandle create error
    运行狗demo时,出现[src/yolov3_app.cpp][0431][forwardThrd]m_alarmPtr->EventHandle create error错误,用iClient查看没有检测框。请问该怎么解决?设备型号:M2121-10-EI(8-32mm)版本:SDC 8.0.1.SPC129
  • [技术干货] 华为"天生会画"有用过的画友么?到底咋样?我亲测还行!
    华为"天生会画"有用过的画友么?到底咋样?我亲测还行!笔刷是真的多!150多种随便挑,水墨效果特别自然,画国风超合适。华为设备之间传图超快,10秒就能搞定,这点比苹果方便多了。新手用着也不费劲,教程很贴心,关键还免费!不过压感偶尔会卡,画细节时有点闹心。其他都还不错!细说几个让我尖叫的功能👇✨【笔刷真的绝了!】 画水墨时那个晕染效果,一笔下去就有深浅变化;油画笔刷的堆叠感超真实,画国风插画时笔锋转折超级自然~(偷偷对比过其他软件,效果确实不太一样!)💻【对新手超友好】柳叶笔+AI抠图:3秒搞定抠图,比我用PS还快!100个图层随便叠:甲方爸爸再也不用担心我改稿崩溃了hhh独家「方天引擎」:4K大图画布放大两倍都不卡,画商稿超安心📱【跨设备画画太爽了】 手机随手画个草图→平板上细化→电脑导出成品,鸿蒙生态传文件秒到还不压缩!(实测比果机的隔空投送有意思一点,仅是个人感受不喜勿喷!)🎁【隐藏彩蛋】自带专业尺规画户型图书法模式会纠正笔顺,练字超级好用每周都有新笔刷,最近敦煌系列美到哭😭小声bb:听说连某些专业美术团队都在用它的AI辅助线功能...PS:其他更多感受,有兴趣的画友自己体验吧!总的来说,日常画画完全够用,特别是喜欢国风的华为用户。用习惯Procreate的画友不妨试试~?求分享小技巧!
  • [其他] 为什么头像风控问题迟迟不能解决?
    一年多了,一个小问题都关闭不了啊
  • [应用开发] MDC610 yolov5/yolov7模型转换适配问题
    MDC610,开发环境版本:8.10.T0.1.B205执行yolov5模型推理本地图片遇到报错:[ERROR]   execute model failed, modelId is 1, error code: 500002在相同环境用ascend/sample中yolov3 caffemodel转出来的模型可以推理,官方yolov5的pt转onnx转om报错,请问是什么原因?再请问平台最高支持yolov几?附转模型过程:pt转onnx:官方yolov5s 6.0版本,转了2版,有concat和无concat版本,转换参数:--weights yolov5s1.pt --opset 11 --include onnx --simplifyonnx转om:转换指令:atc --model=yolov5s1_concat.onnx --framework=5 --output=/home/eddie/zls/demo/model/v5/yolov5s1_concat --soc_version=BS9SX1AA --log=warning >log.txt (log在附件)运行环境的log也附上,但是没有细节报错。
  • [问题求助] 垃圾分类标注数据集
    请问哪里有标注好的生活垃圾的数据集,之前看到华为有一次比赛用的标注好了的垃圾分类数据集,但是找不到了
  • [问题求助] 华为开发者套件Atlas 200 DK A2 运行一直报环境变量和权限错误: File in GST_PLUGIN_PATH is invalid. (Code = 1001, Message = "General Failed")
     一直报错,加环境变量,改权限后还是报错  
  • [问题求助] 代码迁移,npu使用率不高
    使用torch_npu自动迁移的办法,但是npu的使用率非常低,很久才会工作一会,最终训练的时间也远比在本地4090上训练的时间要长,请专家帮我看看什么原因,代码文件在网盘里通过网盘分享的文件:main.py链接: https://pan.baidu.com/s/1L70EFLhXxBoNhdX_njX1jQ?pwd=fcgx 提取码: fcgx
  • [问题求助] npu使用率低
    专家您好,我是在pytorch_2.1.0-cann_8.0.rc3-py_3.9-euler_2.10.10-aarch64-snt9b镜像中训练模型,就是在modelarts的notebook开发环境中,模型训练代码在gpu上可以跑通,现在我用昇腾910的npu跑,资源监控中显示NPU-2 AIcore的使用率非常低,长时间处于百分之零的使用率,但是HBM一直处于86%的使用状态,请问这是什么原因。
  • [问题求助] 如何获取网页验证码登录系统
    使用rpa,登录系统的时候,输入用户名和密码后还需要输入验证码,如何获取验证码?请指教,谢谢!
  • [技术干货] 基于【海思Hi3403/SD3403/SS928】NPU+AI ISP多媒体SoC方案开发AI 算法承载边缘计算_AI摄像机产品
    基于【NPU+AI ISP】方案开发边缘计算数据盒,对标Hi3559A平台边缘计算数据盒性能全面提升,引用达芬奇新DaVinci架构,双NPU组合,算力提升一倍,支持MindSpore AI开发环境,平滑升级无压力,避免因不同选型导致移植周期过长,可以无缝切换快速落地应用,减少运维成本,且供货保持稳定,是升级Hi3559A平台边缘计算方案的最佳选型。 最新发布的SDK版本把双核NPU(4T+6T)都开放出来,但两个NPU核底层的模型和配套工具有区别,如果做边缘计算数据盒开发,总算力可以到10T。开发AI摄像机如需使用6T的NPU核,可使用最新的SDK版本升级成在程序运行时通过软开关来控制启动,实现白天用6T NPU核来跑其它算法,夜间启动AI ISP的最优状态。  视频编解码均支持行业领先的H.264、H.265标准,解码最大可支持10路1080p@30fps,编码最大可支持4K@70fps,SoC具备PCIE的桥接功能,可以通过2颗芯片桥接支持4路4k的接入。编解码整体性能优异且稳定,降低网络波动带来的影响,带AI ISP优化视频画质,输出超高清且细腻画质的同时保持画面高度流畅性。     
  • [问题求助] 图像识别技术原理?
    图像识别技术原理是什么样的?