您尚未登录。

楼主 # 2024-08-10 17:20:10

xichuangxue
会员
注册时间: 2018-06-04
已发帖子: 22
积分: 203

捡漏hi3516ev300摄像头-官方例程改1--基于官方SDK修改,移动侦测实现

SDK 编译可以直接参考这里大佬的博客,特别详细,
https://blog.csdn.net/wirner/article/details/107024607

注意编译的时候,make all要带上CHIP=hi3516ev300,否则default编译的是 hi3516ev200的。
make all CHIP=hi3516ev300

1、烧录官方SDK 编译镜像
SDK编译完成后,在osdrv/pub/hi3516ev300_spi_image_uclibc 目录下,会有生成的 uboot.bin, kernel.bin, rootfs.ext4. 用HiTool 直接烧录即可。

烧录后,在uboot中设置对应的boot cmd和 bootargs即可正常启动。
比如我使用的boot cmd和 bootargs如下


setenv bootargs 'mem=96M console=ttyAMA0,115200 root=/dev/mtdblock3 rw rootfstype=yaffs2 mtdparts=hinand:512K(Uboot),512K(env),5120K(kernel),-(rootfs)'
setenv bootcmd 'nand read 41000000 100000 500000;bootm 41000000'
saveenv


2、拷贝 KO,开机 自动加载 ISP需要使用的KO
启动后,把 SDK中 isp相关的ko全都拷贝(tftp传)到文件系统中。
把SDK /mpp/ko/* 下所有ko打包,传到板子上。

load3516ev300 脚本是需要使用的,修改load3516ev300脚本中的内存地址,保持和uboot中一致即可。

mem_total=128                # 128M, total mem
mem_start=0x40000000         # phy mem start
os_mem_size=96               # 32M, os mem
mmz_start=0x46000000;        # mmz start addr
mmz_size=32M;  

设置开机自动加载ko
vi /etc/init.d/rcS
cd /ko
./load3516ev300 -i -sensor0 imx307




3、环境终于建好了,下面是修改、运行官方的Demo了。
在SDK mpp/sample目录是各种例程,其中,mpp/sample/ive/sample_ive_main.c就是 移动侦测的例程。
打印的 usage中,0是遮挡检测,6是Motion detected, 这里我们重点关注6.

    printf("Usage : %s <index> [complete] [encode] [vo]\n", pchPrgName);
    printf("index:\n");
    printf("\t 0)Occlusion detected.(VI->VPSS->IVE->VO_HDMI).\n");
    printf("\t 1)Canny,<complete>:0, part canny;1,complete canny.(FILE->IVE->FILE).\n");
    printf("\t 2)Gmm2.(FILE->IVE->FILE).\n");
    printf("\t 3)MemoryTest.(FILE->IVE->FILE).\n");
    printf("\t 4)Sobel.(FILE->IVE->FILE).\n");
    printf("\t 5)St Lk.(FILE->IVE->FILE).\n");
    printf("\t 6)Motion detected.(VI->VPSS->IVE->VGS->VO_HDMI).\n");

Motion detected 显示的 数据流:VI->VPSS->IVE->VGS->VO_HDMI, 但当前没有显示屏,没有HDMI,无法看到结果,所以还需要改一改代码。

目标是移动侦测结果输出到文件中,
要改两处:

1、初始化时,关掉VO,打开Venc的初始化

 
ive/sample/sample_ive_md.c 中
-   static SAMPLE_IVE_SWITCH_S s_stMdSwitch = {HI_FALSE,HI_TRUE};
+  static SAMPLE_IVE_SWITCH_S s_stMdSwitch = {HI_TRUE,HI_FALSE};

打开上面开关后,在下面函数里会自动完成其他事情。
SAMPLE_COMM_IVE_StartViVpssVencVo()


2、获取移动侦测的图像后, 输出到Venc进行编码并保存。
SAMPLE_IVE_MdProc函数中,添加图像送到Venc模块

 
	if (HI_TRUE == s_stMdSwitch.bVo){
            s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stBaseFrmInfo,s32MilliSec);
            SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
                            "HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret);

          }
+   if (HI_TRUE == s_stMdSwitch.bVenc){
+            s32Ret = HI_MPI_VENC_SendFrame(0,&stBaseFrmInfo, s32MilliSec);
+           SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
+                       "HI_MPI_VENC_SendFrame fail,Error(%#x)\n",s32Ret);
+       }


修改完上面后,重新make, 此时的 Motion detected就会把侦测结果输出到文件中保存。当然,不输出到文件,改成RTSP实时输出也是可以的。

效果如下,  左边窗帘上不是误检测,是手的影子在动,所以有检测框:

MotionDetect.png

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn