Firefly1126路径下/SDK/app/内的相关程序样例具有很高的参考价值,但是相关的编译资料不全,而且官方教程比较杂乱,这里根据本人的一些编译经验进行总结归纳,最终实现app内的程序编译-运行-实现。这里以sdk/app/firefly_rkmedia_demo内的一个程序作为例子进行实现。
第一步:
由于官方使用的是 buildroot 系统,所以你需要先编译一遍官方的 SDK,来构建依赖环境。下面是编译官方 SDK 的 WIKI 链接。https://wiki.t-firefly.com/zh_CN/CAM-C11262U/Source_code.html。
注意:编译之前你需要打开 buildroot 的相关配置,否则后续无法编译通过。需要找到自己的使用的 config 文件并且修改。
Buildroot编译配置指令如下(与编译Rootfs的过程相同):
#利用以下代码可以查看开发板的配置文件 cat device/rockchip/.BoardConfig.mk
#之后source buildroot对应的defconfig source envsetup.sh firefly_rv1126_rv1109
### 有两种文件配置buildroot,一是使用menuconfig配置buildroot,选择需要的模块,最后保存退出。 ### 例如:要配置app/ipc-daemon这个工程 ### a. 找到app/ipc-daemon对应的配置文件 ### grep -lr "app/ipc-daemon" buildroot/package ### buildroot/package/rockchip/ipc-daemon/ipc-daemon.mk ### 对应的配置文件:buildroot/package/rockchip/ipc-daemon/Config.in ### b. 查看buildroot/package/rockchip/ipc-daemon/Config.in 获取配置名称BR2_PACKAGE_IPC_DAEMON ### make menuconfig # 进入menuconfig后,按“/"进入查找模式,输入BR2_PACKAGE_IPC_DAEMON
对于本例中sdk/app/firefly_rkmedia_demo下的程序,需要在firefly_rv1126_rv1109_defconfig配置文件加入以下配置,按照以上配置搜索以下配置名称并逐一加入,主要为OPENCV与ZBAR的配置:
# OPENCV3 BR2_PACKAGE_OPENCV3=y BR2_PACKAGE_OPENCV3_LIB_CALIB3D=y BR2_PACKAGE_OPENCV3_LIB_FEATURES2D=y BR2_PACKAGE_OPENCV3_LIB_FLANN=y BR2_PACKAGE_OPENCV3_LIB_HIGHGUI=y BR2_PACKAGE_OPENCV3_LIB_IMGCODECS=y BR2_PACKAGE_OPENCV3_LIB_IMGPROC=y BR2_PACKAGE_OPENCV3_LIB_ML=y BR2_PACKAGE_OPENCV3_LIB_OBJDETECT=y BR2_PACKAGE_OPENCV3_LIB_PHOTO=y BR2_PACKAGE_OPENCV3_LIB_SHAPE=y BR2_PACKAGE_OPENCV3_LIB_STITCHING=y BR2_PACKAGE_OPENCV3_LIB_SUPERRES=y BR2_PACKAGE_OPENCV3_LIB_TS=y BR2_PACKAGE_OPENCV3_LIB_VIDEOIO=y BR2_PACKAGE_OPENCV3_LIB_VIDEO=y BR2_PACKAGE_OPENCV3_LIB_VIDEOSTAB=y BR2_PACKAGE_OPENCV3_WITH_FFMPEG=y BR2_PACKAGE_OPENCV3_WITH_GSTREAMER1=y BR2_PACKAGE_OPENCV3_WITH_JASPER=y BR2_PACKAGE_OPENCV3_WITH_JPEG=y BR2_PACKAGE_OPENCV3_WITH_PNG=y BR2_PACKAGE_OPENCV3_WITH_PROTOBUF=y BR2_PACKAGE_OPENCV3_WITH_TIFF=y BR2_PACKAGE_OPENCV3_WITH_V4L=y BR2_PACKAGE_OPENCV3_WITH_WEBP=y BR2_PACKAGE_FIREFLY_RKMEDIA_DEMO=y BR2_PACKAGE_ZBAR=y
并且在该例子中不同的板型对应使用不同的代码,如下所示:
ffrtsp_demo_test.cc rkmedia_rtspget_multi_arc_test.cc rkmedia_rtspget_multi_test.cc rkmedia_rtspget_multi_venc_rtsp.cc rkmedia_rtspget_vdec_rknn_venc_rtsp_test.cc rkmedia_rtspget_vdec_test.cc rkmedia_rtspget_vdec_venc_rtsp_test.cc rkmedia_vdec_test.c rkmedia_vdec_venc_rtsp_test.c rkmedia_vi_rknn_venc_rtsp_test.c rkmedia_vi_venc_rtsp_test.c rkmedia_vi_zbar_test.c
rkmedia_vdec_test.c rkmedia_vi_double_cameras_zbar_test.c
加入配置文件后的buildroot的配置文件如下所示:
保存后退出,并在终端下执行以下命令保存buildroot配置文件
make savedefconfig
第二步:
按照第一步的步骤完成后编译Buildroot,在sdk目录下执行以下指令编译buildroot:
./build.sh buildroot
执行以上步骤后,在路径/home/kxq/Desktop/rv1126_rv1109_linux_release_20210306/buildroot/output/firefly_rv1126_rv1109/build/firefly_rkmedia_demo-1.0
下会生成所有firefly_rkmeida_demo中的可执行文件,之后将rootfs下载至开发板,直接在开发板上执行的文件(如:./rkmedia_vi_zbar_test -a /oem/etc/iqfiles)即可运行。
以下介绍单独编译的步骤指令。
编译完成后你会在 buildroot 仓库下找到文件系统编译依赖环境,本人的为:
#sdk/buildroot/output/firefly_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot /home/kxq/Desktop/rv1126_rv1109_linux_release_20210306/buildroot/output/firefly_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot
之后把 SDK 的绝对路径和依赖环境的相对路径填入 RKmedia 二维码识别仓库的 build.sh 文件中,此build.sh在路径sdk/app/firefly_rkmedia_demo下,如下所示。
然后在firefly_rkmedia_demo目录下终端内执行脚本编译,生成可执行文件,这里以下面一个rkmedia_vi_zbar_test.c的文件为例:
./build.sh rkmedia_vi_zbar_test.c
这里注意,rkmedia_vi_zbar_test.c代码中相关代码需要具体适配个人的摄像头参数,不匹配会有运行方面的错误。
同样地,将rootfs下载至开发板,并将此可执行程序上传至开发板,比之前的全局编译整个demo文件要快许多。若正确编译buildroot同时成功下载至开发板,则则在开发板的/usr/bin目录下可以看见zbar的动态链接库。
之后,在rkmedia_vi_zbar_test.c的保存处执行以下命令,在修改了rkmedia_vi_zbar_test的部分代码后,执行后将摄像头拍摄手机上二维码后显示如下,:
./rkmedia_vi_zbar_test -a /oem/etc/iqfiles
由于本人用的是USB摄像头,分辨率并不是太高,因此修改了代码中的分辨率信息,最后在拍摄二维码时也是因为分辨率的关系拍摄距离与二维码比较近(约15CM左右),并且本人没有用到输出屏幕,因此代码中的VO模块也并未用到,需要注释或删除。以下是本人更改后的rkmedia_vi_zbar_test代码下载链接:
rkmedia_vi_zbar_test.c
其中有几个部分值得关注:
一是:
zbar_image_set_format(image, zbar_fourcc('N', 'V', '1', '2')); 需要根据自己摄像头的拍摄图像的YUV格式修改为 zbar_image_set_format(image, *(int*)"YUYV");
二是:
#因为在本个测试例子中没有用到VO模块,因此与VO模块注册相关的代码需要一并注释删除,同时原厂代码中还注册了一个以下一个RGA通道与VO模块绑定,不要忘记注释删除。 /* Create RGA */ stRgaAttr.bEnBufPool = RK_TRUE; stRgaAttr.u16BufPoolCnt = 12; stRgaAttr.u16Rotaion = 90; stRgaAttr.stImgIn.u32X = 0; stRgaAttr.stImgIn.u32Y = 0; stRgaAttr.stImgIn.imgType = IMAGE_TYPE_NV12; stRgaAttr.stImgIn.u32Width = 1920; stRgaAttr.stImgIn.u32Height = 1080; stRgaAttr.stImgIn.u32HorStride = 1920; stRgaAttr.stImgIn.u32VirStride = 1080; stRgaAttr.stImgOut.u32X = 0; stRgaAttr.stImgOut.u32Y = 0; stRgaAttr.stImgOut.imgType = IMAGE_TYPE_RGB888; stRgaAttr.stImgOut.u32Width = 800; stRgaAttr.stImgOut.u32Height = 1280; stRgaAttr.stImgOut.u32HorStride = 800; stRgaAttr.stImgOut.u32VirStride = 1280; ret = RK_MPI_RGA_CreateChn(1, &stRgaAttr); if (ret) { printf("Create rga[0] falied! ret=%d\n", ret); return -1; }
参考资料:
https://dev.t-firefly.com/forum.php?mod=viewthread&tid=103667&highlight=zbar
https://dev.t-firefly.com/forum.php?mod=viewthread&tid=112043&highlight=firefly\_rkmedia\_demo
https://blog.csdn.net/bbdxf/article/details/79356259