海思AI芯片(Hi3519A/3559A)方案学习(十九)如何在推理动态链接库中引入opencv库

前言

海思AI芯片(Hi3519A/3559A)方案学习(十八)如何将sample sdk代码重构并编译成动态链接库 有提到如何将sample代码重构成推理动态链接库,提供api给应用层调用。但是sample代码只是将bgr或yuv格式的二进制数据送给nnie进行推理,所以还需要添加代码来实现先实现jpeg文件读取并转换成bgr格式数据,从而构造一个完整的应用。

实现一

这里的解决办法是移植opencv库到海思arm平台,具体详见:海思AI芯片(Hi3519A/3559A)方案学习(十二)移植opencv343到hi3519A 。然后调用opencv API来实现文件的读取以及数据格式的转换。

因为推理链接库是用c实现的,所以第一个方法就是调用opencv的C接口,比如

IplImage* resizeImg = cvCreateImage(cvSize(new_w, new_h), pImg->depth, pImg->nChannels);

包含如下头文件:

#include <opencv/cv.h>
#include <opencv/highgui.h>

在编译动态库以及和应用代码编译链接成 可执行程序时,需要添加如下红框所示的参数:

 补充说明:

1)生成推理动态库libnnie_ais.o时,需要include 交叉编译生成的opencv头文件。

2)生成可执行程序ai_test时,需要链接libopencv_world.so以及libstdc++.so。 前者是交叉编译生成的,后者是专门针对该嵌入式平台的c++库,因为opencv里面有不少c++代码,所以虽然没有调用c++接口,但是仍然需要链接该库。

3)本来想法是生成opencv静态库(成功),然后在lib_nnie.so里面直接链接进来,但是没有成功,通过readelf发现静态库不包含某些api,比如pnd_read_image等,导致链接不过。需要再进一步debug。(补充,这个已经在海思AI芯片(Hi3519A/3559A)方案学习(二十)opencv静态库和动态库的区别 上解决)

实现二

方法一里面调用c接口有些工作不正常,比如说cvLoadImage后,就变成了灰度图,照理缺省的应该是bgr三通道图,这个倒简单,只是没深究。最主要的一个头疼问题调用cvSaveImage会挂掉。

所以最后使用了方法二,即使用opencv的c++接口,比如:

	Mat img = imread(pstNnieCfg->pszPic);

c++接口用的比较顺手,没那么多问题。 需要注意一点就是 得把所在的c文件改成后缀名为cpp文件。头文件包含也得是c++格式,该cpp文件如下所示:

#include "image_opencv.h"
#include <opencv2/opencv.hpp>

using namespace cv;

extern "C" {   //后注,cpp里面没有必要添加这个修饰符,关键是在image_opencv.h里面添加。
.....
}

编译参数还是和上面方法一相同。 

结论

通过本博文可以学习到如何在c库里面调用opencv的c和c++ APIs。一个注意项是,得加上-lstdc++,当然此libstdc++.so必须是平台所对应的。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值