题目:
也就是输入一张JPEG图片,经过DVPP解码+缩放+编码后将结果输出,由于gitee代码仓中没有直接可以实现的代码,不过提供了jpege,resize,jpege三个功能单独实现的代码,以及一个基于 Caffe ResNet-50 网络实现图片分类(图片解码+抠图缩放+图片编码+同步推理)的代码,这两个是可供参考的代码,其中后者也没有直接实现解码+缩放+编码三个流程穿起来的部分,且由于代码的模块化和适配性都比较高,代码规范,读起来需要花费较长的时间,由于时间有限,选择了将前者三个代码串在一个project中,这样可行性高一些。
编写的思路大概是:
输入jpg图片——图片解码——yuv格式保存——读取保存的yuv图片——图像缩放——保存缩放后的yuv图片——读取resize后的yuv图片——图片编码——保存jpg图片
由于对于C++也不是特别熟悉下面就是我在串接过程中遇到的一些问题以及相应的解决办法:
1、/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/xyt_one/src/main.cpp:438:74: error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string}’ to ‘const char*’ for argument ‘1’ to ‘Result SaveDvppOutputData(const char*, const void*, uint32_t)’
SaveDvppOutputData(resize_outPic, vpcOutBufferDev_, vpcOutBufferSize_);
上面这个问题表明无法将string类型转换为const char*输入到SaveDvppOutputData中。这个问题是由于我定义了std::string resize_outPic = "resize.yuv";,需要用resize_outPic.c_str()将C++字符串转为C字符串。
2、/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/xyt_one/src/main.cpp:194:9: error: redefinition of ‘int32_t deviceId_’
int32_t deviceId_;
/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/xyt_one/src/main.h:54:9: note: ‘int32_t deviceId_’ previously defined here
int32_t deviceId_ = 0;
关于这类问题:redefinition ,都是因为重复定义导致的报错,粘贴的时候重复粘贴。device、context、stream、ChannelDesc、Channel都仅需申请一次即可。
3、[ERROR] acldvppJpegEncodeAsync failed, aclRet = 100000
[ERROR] The program failed to run, please check the log in the /var/log/npu/slog/host-0 directory!
/var/log/npu/slog/host-0中的报错为:
[ERROR] PROFILING(2081,ada):2021-01-30-14:24:15.038.759 [toolchain/profiler/collector/dvvp/host/../common/utils/utils.cpp:278] >>> (tid:140480588994368) Failed to mkdir, FilePath : /usr/local/Ascend/driver/tools//aging/, FileMode : 750, ErrorCode : 1, ERRORInfo : Operation not permitted
[ERROR] PROFILING(2081,ada):2021-01-30-14:24:15.038.802 [toolchain/profiler/collector/dvvp/host/../aging/prof_file_record.cpp:84] >>> (tid:140480588994368) Creating dir: /usr/local/Ascend/driver/tools//aging/ err!
[ERROR] PROFILING(2081,ada):2021-01-30-14:24:15.038.815 [toolchain/profiler/collector/dvvp/host/../common/utils/utils.cpp:943] >>> (tid:140480588994368) ErrorCode:1, errinfo:Operation not permitted
[ERROR] PROFILING(2081,ada):2021-01-30-14:24:15.038.826 [toolchain/profiler/collector/dvvp/host/../task_handle/src/prof_manager.cpp:797] >>> (tid:140480588994368) Init ProfFileRecord failed.
[ERROR] PROFILING(2081,ada):2021-01-30-14:24:15.038.837 [toolchain/profiler/collector/dvvp/host/../task_handle/src/prof_manager.cpp:81] >>> (tid:140480588994368) Prof_inotify_start failed,Please verify profile.cfg permissions and content!
这条是在build通过以后,run的时候出错了。报错提示acldvppJpegEncodeAsync 失败,检查一下acldvppJpegEncodeAsync 的各个参数,发现通道以及通道描述信息在resize的时候释放了,指向了Nullptr。而通道释放后便不可再用。
4、结果出错,经过一系列调试后,终于可以运行成功了,但是 结果确实不对。错误结果如下
按理来说有绿边是正常的,但是整个图片全绿就不正常了,再检代码发现,原始图像的输入尺寸为1024*683,在resize的时候将解码图片作为输入,并输入图片的尺寸,而此时的我输入的尺寸大小为1024*1068(也不知道脑子里会出现这个数字)。修改为1024*683后图片正常被解码缩放编码。
如有不对也请大家多多指教~