【SemeDrive】【X9HP】【PTG4.6】SDCV demo :canny 邊緣檢測

前言: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 也可按照以上方法編譯使用。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論

simh

simh

24 天前
可以尝试更多的demo,有些需求或者需要改进的地方,请反馈给我,谢谢。
simh

simh

24 天前
Nice!