前言:sdcv(SemiDrive Computer Vision)支持的後端設備主要包括VDSP,G2D,CPU,使用 VDSP 或 G2D 處理圖像可節省 CPU 資源。以下以 sdcv_canny 邊緣檢測說明如何使用 SDCV 。
一、 API 簡介
1. 原型int sdcv_canny(sdcv_t stream,
p_sdcv_img_t img_buf,
p_sdcv_img_t out_buf,
p_sdcv_img_t par_buf,
int dev)
2. 參數sdcv_t stream: 流對象,控制管理數據流,由 sdcv_t sdcv_create_stream(int flags) 創建(flags 不使用,可為任意值)
p_sdcv_img_t img_buf: 此結構體的 vir_addr 成員指向源圖像數據
p_sdcv_img_t out_buf: 此結構體的 vir_addr 成員指向輸出圖像數據
p_sdcv_img_t par_buf:此結構體的 vir_addr 成員指向 pt_canny_t 結構體,需填充以下數據:
src.width |
源圖像寬; |
src.height |
源圖像高; |
src.pitch |
源圖像寬 * 每像素 bytes; |
src.type |
像素類型例如:SDCV_8UC1、SDCV_8UC2、SDCV_8UC3、SDCV_8UC4 等; |
dst.width |
目標圖像寬; |
dst.height |
目標圖像高; |
dst.pitch |
目標圖像寬 * 每像素 bytes; |
dst.type |
像素類型例如:SDCV_8UC1、SDCV_8UC2、SDCV_8UC3、SDCV_8UC4 等; |
high_threshold |
高閾值。如果像素的梯度強度超過高閾值,視為強邊緣。 |
low_threshold |
低閾值。如果梯度強度低於低閾值,則將其抑制。如果梯度強度介於低閾值和高閾值之間,並且與強邊緣相連,則將其視為弱邊緣。 |
trace_edges |
開啟則保留與強邊緣相鄰的弱邊緣,其他的將被抑制。這樣可以提取出連續的邊緣線條。 |
l2gradient |
梯度flag,默認為false,即梯度計算時使用L1 norm;如果設為false,則梯度計算時使用L2 norm。 |
borderType |
邊界擴展方式,不支持 SDCV_BORDER_WRAP; |
int dev:指定後端處理數據,可以是 SDCV_DEV_VDSP 或 SDCV_DEV_CPU,此功能不支持 SDCV_DEV_G2D
3. Android Demo 編譯
vendor/semidrive/sdcv/samples/cpp/demo_sdcv_canny.cpp 中保存輸出圖像時未指定路徑,需修改
snprintf(file_name, 128, "%s_canny_output.png", tgt[arg_target_id]); |
為
snprintf(file_name, 128, "%s%s_canny_output.png", "/data/",tgt[arg_target_id]); |
添加編譯選項,在 vendor/semidrive/sdcv/Android.bp 末尾添加:
cc_binary { name: "demo_sdcv_canny", vendor: true,
cflags:[ "-Wno-date-time", "-fexceptions", ],
srcs: [ "samples/cpp/demo_sdcv_canny.cpp", ],
include_dirs: [],
shared_libs: [ "libc", "liblog", "libsdcv", "libion", "libopencv_core", "libopencv_features2d", "libopencv_flann", "libopencv_highgui", "libopencv_imgcodecs", "libopencv_imgproc", ],
local_include_dirs: [ "include", "include/android_config", "3rdparty/opencv/aosp_build/include/opencv-4.5.5", ],
rtti: true, clang: true, } |
編譯(87 為對應的配置編號,根據實際修改)
cd android12/ source build/envsetup.sh lunch 87 mm vendor/semidrive/sdcv/ |
4. Yocto Demo 編譯
source/sdcv/samples/cpp/demo_sdcv_canny.cpp 中保存輸出圖像時未指定路徑,需修改
snprintf(file_name, 128, "%s_canny_output.png", tgt[arg_target_id]); |
為
snprintf(file_name, 128, "%s%s_canny_output.png", "/data/",tgt[arg_target_id]); |
修改編譯選項,修改 meta-semidrive/recipes-bsp/sdcv-demo/sdcv-demo_1.0.bb
export DEMO_SRC = "${sample_path}/demo_ sdcv_canny.cpp" |
編譯
DISTRO=cluster-qt MACHINE=x9hp_ms_a12_vemmc_ap2 source sd_setup.sh -b build-meta_sdcv bitbake core-image-base |
二、運行
1. 拷貝固件
Android 固件位於 android12\out\target\product\x9hp_ms\vendor\bin\
Yocto 固件位於 yocto\ build-meta_sdcv\tmp\deploy\images\ x9hp_ms_a12_vemmc_ap2\
2. 運行
原圖(灰度圖):
demo_sdcv_canny --loop=10 --srcw=1000 --srch=1000 --image=/data/vdsp_csc_code6.bin --target=1 --ksize=3
demo_sdcv_canny --loop=10 --srcw=1280 --srch=720 --image=/data/vdsp_csc_code6.bin --target=1 --ksize=3 --low_threshold=50 --high_threshold=150
demo_sdcv_canny --loop=10 --srcw=1000 --srch=1000 --image=/data/vdsp_csc_code6.bin --target=1 --ksize=3 --low_threshold=40 --high_threshold=50
demo_sdcv_canny --loop=10 --srcw=1000 --srch=1000 --image=/data/vdsp_csc_code6.bin --target=1 --ksize=5 --low_threshold=40 --high_threshold=50
總結:X9HP 可在 Android 及 Linux 使用 VDSP 進行邊緣檢測,除邊緣檢測外,其他 demo 也可按照以上方法編譯使用。
評論
simh
24 天前
simh
24 天前