【SemeDrive】【X9HP】【PTG4.6】SDCV demo :canny 边缘检测

发布于:2024-10-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

欢迎登录大大通,了解更多精彩技术内容!