Firefly1126中SDK目錄下APP內相關程式編譯使用問題
Firefly1126中SDK目錄下APP內相關程式編譯使用問題
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
並且在該例子中不同的板型對應使用不同的程式碼,如下所示:
- aio-1126-jd4 / aio-1109-jd4 板型適用以下 demo
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
- CAM-C1126S2U / CAM-C1109S2U 智慧雙目攝像頭模組適用以下 demo
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程式碼下載連結:
其中有幾個部分值得關注:
一是:
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