
merz


3.9w 访问量
0 原创专栏
0 资料
1 粉丝
个性签名:此E友还没有留下个性签名哦~
加入易百纳时间:2019-08-22
按发布时间
按阅读量
按点赞量
-
null 海思平台的前景提取实现代码的主要思路是 上上帧 和 上一帧 相减得到 差值图像1,上一帧 和 当前帧 相减得到 差值图像2。差值图像1 与 2 做运算得到前景图像。 /************************************************************ FileName: sample_ive_sfd.c Author: Merz Description: frame subtract to extract the foreground image Version: 1.0 Function List: 1. SAMPLE_IVE_Sub 2. SAMPLE_IVE_Thresh 3. SAMPLE_IVE_Dilate 4. SAMPLE_IVE_And History:2019-12-310 0 3874
-
null IVE使用模板总结目录 (Table of Contents) [TOCM] 对单张图片进行处理 对单个视频进行处理 @[toc] 对单张图片进行处理 #include
#include #include #include #include #include #include #include #include #include #include #include #include #include "sample_comm_ive.h" //需要用到的文件和处理过程中的图片 typedef struct hiSAMPLE_IVE_TEST_S { IVE_SRC_IMAGE_S stSrc; //input frame IVE_DST_IMAGE_S stDst; //output frame FILE* pFpSrc; //read from pFpSrc FILE* pFpDst; //write to pFpDst }SAMPLE_IVE_TEST_S; static SAMPLE_IVE_TEST_S s_stTest; //解除初始化,释放初始化时申请的内存 static HI_VOID SAMPLE_IVE_Test_Uninit(SAMPLE_IVE_TEST_S *pstTest) { IVE_MMZ_FREE(pstTest->stSrc.au64PhyAddr[0], pstTest->stSrc.au64VirAddr[0]); IVE_MMZ_FREE(pstTest->stDst.au64PhyAddr[0], pstTest->stDst.au64VirAddr[0]); IVE_CLOSE_FILE(pstTest->pFpSrc); IVE_CLOSE_FILE(pstTest->pFpDst); } //初始化,申请内存 static HI_S32 SAMPLE_IVE_Test_Init(SAMPLE_IVE_TEST_S *pstTest, HI_U32 u32Width, HI_U32 u32Height, HI_CHAR *pchSrcFileName, HI_CHAR *pchDstFileName) { HI_S32 s32Ret; memset(pstTest, 0, sizeof(SAMPLE_IVE_TEST_S)); s32Ret = HI_FAILURE; pstTest->pFpSrc = fopen(pchSrcFileName, "rb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstTest->pFpSrc, TEST_INIT_FAIL, "Error,Open file %s failed!\n", pchSrcFileName); pstTest->pFpDst = fopen(pchDstFileName, "wb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstTest->pFpDst, TEST_INIT_FAIL, "Error,Open file %s failed!\n", pchDstFileName); s32Ret = HI_SUCCESS; s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTest->stSrc), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, TEST_INIT_FAIL, "Error(%#x),Create Src image failed!\n", s32Ret); s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTest->stDst), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, TEST_INIT_FAIL, "Error(%#x),Create Dst image failed!\n", s32Ret); TEST_INIT_FAIL: if (HI_SUCCESS != s32Ret) { SAMPLE_IVE_Test_Uninit(pstTest); } return s32Ret; } //以LBP举例,里面的具体参数的设置需要参考《 HI_IVE参考.pdf 》 static HI_S32 SAMPLE_IVE_Lbp(IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstDst) { HI_S32 s32Ret; IVE_HANDLE IveHandle; IVE_LBP_CTRL_S stCtrl; memset(&stCtrl,0,sizeof(IVE_LBP_CTRL_S)); stCtrl.enMode = IVE_LBP_CMP_MODE_ABS; // stCtrl.enMode =IVE_LBP_CMP_MODE_NORMAL; stCtrl.un8BitThr.s8Val = 10; s32Ret = HI_MPI_IVE_LBP(&IveHandle, pstSrc, pstDst, &stCtrl, HI_FALSE); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),HI_MPI_IVE_Lbp failed!\n",s32Ret); return s32Ret; } //主要处理过程的函数 static HI_S32 SAMPLE_IVE_TestProc(SAMPLE_IVE_TEST_S *pstTest) { HI_S32 s32Ret = HI_SUCCESS; //读文件到图片格式中 s32Ret = SAMPLE_COMM_IVE_ReadFile(&pstTest->stSrc, pstTest->pFpSrc); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),Read src1 file failed!\n",s32Ret); //做IVE处理 s32Ret = SAMPLE_IVE_Lbp(&pstLbp->stSrc, &pstLbp->stDst); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),SAMPLE_IVE_Lbp failed!\n",s32Ret); //把处理完的结果写到文件中 s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstTest->stDst, pstTest->pFpDst); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),write file failed!\n",s32Ret); return s32Ret; } HI_VOID SAMPLE_IVE_Test(HI_VOID) { HI_S32 s32Ret = HI_SUCCESS; //图片格式信息和文件信息 HI_U32 u32Width = 1920; HI_U32 u32Height = 1080; HI_CHAR pchSrcFileName[500]; HI_CHAR pchDstFileName[500]; snprintf(pchSrcFileName, sizeof(pchSrcFileName), "./data/input/test/1920x1080.yuv"); snprintf(pchDstFileName, sizeof(pchDstFileName), "./data/output/test/test.yuv"); //初始化内存 memset(&s_stTest,0,sizeof(s_stTest)); //开启 MPI SAMPLE_COMM_IVE_CheckIveMpiInit(); //初始化 s32Ret = SAMPLE_IVE_Test_Init(&s_stTest, u32Width, u32Height, pchSrcFileName, pchDstFileName); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, TEST_FAIL, "Error(%#x),SAMPLE_IVE_Test_Init failed!\n", s32Ret); //处理 s32Ret = SAMPLE_IVE_TestProc(&s_stTest); if (HI_SUCCESS == s32Ret) { SAMPLE_PRT("Process success!\n"); } //解除初始化 SAMPLE_IVE_Test_Uninit(&s_stTest); memset(&s_stTest,0,sizeof(s_stTest)); TEST_FAIL: SAMPLE_COMM_IVE_IveMpiExit(); } 对单个视频进行处理 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sample_comm_ive.h" #define SAMPLE_IVE_SFD_IMAGE_NUM 2 typedef struct hiSAMPLE_IVE_SFD_S { IVE_SRC_IMAGE_S astSrc[SAMPLE_IVE_SFD_IMAGE_NUM]; //input frame IVE_DST_IMAGE_S stDst; //output frame FILE* pFpSrc; //read from pFpSrc FILE* pFpDst; //write to pFpDst }SAMPLE_IVE_SFD_S; static SAMPLE_IVE_SFD_S s_stSfd; static HI_VOID SAMPLE_IVE_Sfd_Uninit(SAMPLE_IVE_SFD_S *pstSfd) { HI_U16 i; for (i = 0; i < 2; i++) { IVE_MMZ_FREE(pstSfd->astSrc[i].au64PhyAddr[0], pstSfd->astSrc[i].au64VirAddr[0]); } IVE_MMZ_FREE(pstSfd->stDst.au64PhyAddr[0], pstSfd->stDst.au64VirAddr[0]); IVE_CLOSE_FILE(pstSfd->pFpSrc); IVE_CLOSE_FILE(pstSfd->pFpDst); } static HI_S32 SAMPLE_IVE_Sfd_Init(SAMPLE_IVE_SFD_S *pstSfd, HI_U32 u32Width, HI_U32 u32Height, HI_CHAR *pchSrcFileName, HI_CHAR *pchDstFileName) { HI_S32 s32Ret = HI_SUCCESS; HI_U16 i; memset(pstSfd, 0, sizeof(SAMPLE_IVE_SFD_S)); for (i = 0; i < 2; i++) { s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSfd->astSrc[i]), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, SFD_INIT_FAIL, "Error(%#x),Create src[%d] image failed!\n", s32Ret, i); } s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSfd->stDst), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, SFD_INIT_FAIL, "Error(%#x),Create stDst image failed!\n", s32Ret); s32Ret = HI_FAILURE; pstSfd->pFpSrc = fopen(pchSrcFileName, "rb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstSfd->pFpSrc, SFD_INIT_FAIL, "Error,Open file %s failed!\n", pchSrcFileName); pstSfd->pFpDst = fopen(pchDstFileName, "wb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstSfd->pFpDst, SFD_INIT_FAIL, "Error,Open file %s failed!\n", pchDstFileName); s32Ret = HI_SUCCESS; SFD_INIT_FAIL: if (HI_SUCCESS != s32Ret) { SAMPLE_IVE_Sfd_Uninit(pstSfd); } return s32Ret; } //以LBP举例,里面的具体参数的设置需要参考《 HI_IVE参考.pdf 》 static HI_S32 SAMPLE_IVE_Lbp(IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstDst) { HI_S32 s32Ret; IVE_HANDLE IveHandle; IVE_LBP_CTRL_S stCtrl; memset(&stCtrl,0,sizeof(IVE_LBP_CTRL_S)); stCtrl.enMode = IVE_LBP_CMP_MODE_ABS; // stCtrl.enMode =IVE_LBP_CMP_MODE_NORMAL; stCtrl.un8BitThr.s8Val = 10; s32Ret = HI_MPI_IVE_LBP(&IveHandle, pstSrc, pstDst, &stCtrl, HI_FALSE); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),HI_MPI_IVE_Lbp failed!\n",s32Ret); return s32Ret; } static HI_S32 SAMPLE_IVE_SfdProc(SAMPLE_IVE_SFD_S *pstSfd) { HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32FrmNum; HI_S32 s32CurIdx = 0; HI_U32 u32TotalFrm = 200; for (u32FrmNum = 1; u32FrmNum < u32TotalFrm; u32FrmNum++) { SAMPLE_PRT("Proc Frame %d/%d\n",u32FrmNum,u32TotalFrm); s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstSfd->astSrc[s32CurIdx]), pstSfd->pFpSrc); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),Read src1 file failed!\n",s32Ret); //做IVE处理 s32Ret = SAMPLE_IVE_Lbp(&pstLbp->stSrc, &pstLbp->stDst); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),SAMPLE_IVE_Lbp failed!\n",s32Ret); s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstSfd->stDst, pstSfd->pFpDst); s32CurIdx = 1 - s32CurIdx; //change cur image to last image } return s32Ret; } HI_VOID SAMPLE_IVE_Sfd(HI_VOID) { HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32Width = 1280; HI_U32 u32Height = 720; HI_CHAR pchSrcFileName[IVE_FILE_NAME_LEN]; HI_CHAR pchDstFileName[IVE_FILE_NAME_LEN]; snprintf(pchSrcFileName, sizeof(pchSrcFileName), "./data/input/sfd/1280x720.yuv"); snprintf(pchDstFileName, sizeof(pchDstFileName), "./data/output/sfd/sfd.yuv"); memset(&s_stSfd,0,sizeof(s_stSfd)); SAMPLE_COMM_IVE_CheckIveMpiInit(); s32Ret = SAMPLE_IVE_Sfd_Init(&s_stSfd, u32Width, u32Height, pchSrcFileName, pchDstFileName); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, SFD_FAIL, "Error(%#x),SAMPLE_IVE_Sfd_Init failed!\n", s32Ret); s32Ret = SAMPLE_IVE_SfdProc(&s_stSfd); if (HI_SUCCESS == s32Ret) { SAMPLE_PRT("Process success!\n"); } SAMPLE_IVE_Sfd_Uninit(&s_stSfd); memset(&s_stSfd,0,sizeof(s_stSfd)); SFD_FAIL: SAMPLE_COMM_IVE_IveMpiExit(); } 2019-12-310 0 1799 -
null 在海思平台上实现统计图像像素非零点个数目录 (Table of Contents) [TOCM] 1 对 IVE_IMAGE_S 的分析 说明 定义 成员 二维广义图像类型表 图像描述 2 代码实现 代码 3 使用海思 IVE 实现 countNonZero 1 对 IVE_IMAGE_S 的分析 这部分内容来自海思文档 HiIVE API 参考 ,文档中有更多图像类型的说明内容。 说明 定义二维广义图像信息。 定义 typedef struct hiIVE_IMAGE_S { HI_U64 au64PhyAddr[3]; /* RW;The physical address of the image */ HI_U64 au64VirAddr[3]; /* RW;The virtual address of the image */ HI_U32 au32Stride[3]; /* RW;The stride of the image */ HI_U32 u32Width; /* RW;The width of the image */ HI_U32 u32Height; /* RW;The height of the image */ IVE_IMAGE_TYPE_E enType; /* RW;The type of the image */ }IVE_IMAGE_S; 成员 成员名称 描述 au64PhyAddr[3] 广义图像的物理地址数组 au64VirAddr[3] 广义图像的虚拟地址数组 au32Stride[3] 广义图像的跨度 u32Width 广义图像的宽度 u32Height 广义图像的高度 enType 广义图像的图像类型 二维广义图像类型表 类型 图像描述 内存地址 跨度 IVE_IMAGE_TYPE_U8C1 8bit 无符号单通道图像 仅用到 IVE_IMAGE_S 中的 au64PhyAddr[0]、au64VirAddr[0] 仅用到 u32Stride[0] 图像描述 如果图片类型为 IVE_IMAGE_TYPE_U8C1 时,n 取 8。 关于对 Width 和 Stride 的理解,请参考 yuv 图像里的stride和plane的解释 2 代码实现 根据上一小节的分析,我们知道 Width 是小于等于 Stride 的。当输入的图片格式是 U8C1 时,图片的 Width 等于 Stride。当然下面的代码也可以进一步简化。 这里的代码是想参考 opencv 的 countNonZero 函数,返回值是灰度值不为0的像素数。同时也打印出各个像素点的灰度值。 但是此方法耗时过长,对720x576的图像处理一次时间为0.28s,推荐使用3 使用海思 IVE 实现 countNonZero 代码 /* As we all know, au32Stride[0] greater than u32Width */ static HI_U32 CountNonZero(IVE_IMAGE_S *pstImg) { HI_U16 u16Row; HI_U16 u16List; HI_U8* u8copy; //read HI_U8* u8origin; //change line HI_U16 height; HI_U16 width; HI_U16 NonZeroCount = 0; height = pstImg->u32Height; width = pstImg->u32Width; u8copy = (HI_U8 *)(HI_UL)pstImg->au64VirAddr[0]; u8origin = (HI_U8 *)(HI_UL)pstImg->au64VirAddr[0]; for (u16Row = 0; u16Row < height; ++u16Row) { for(u16List = 0; u16List < width; ++u16List) { printf("%d ", *u8copy); if(*u8copy != 0) { NonZeroCount++; } u8copy += 1; } printf("\n"); u8origin += pstImg->au32Stride[0]; //switch to the next line u8copy = u8origin; } return NonZeroCount; } ## 效果 * 先使用 CV 生成一张 64x64 的图像,其中 10~19 行是黑色部分。 ```cpp #include
#include #include #include #include using namespace cv; using namespace std; int main() { Mat image(64, 64, CV_8UC1); for (int i = 0; i < image.rows; i++) { uchar* p = image.ptr (i); for (int j = 0; j < image.cols; j++) { if (i < 20 && i>=10) { p[j] = 0; } else { p[j] = 255; } } } imwrite("demo.jpg", image); return 0; } 转化为 yuv 格式图像 ffmpeg -i demo.jpg -pix_fmt gray demo.yuv 结果 3 使用海思 IVE 实现 countNonZero 阅读文档后发现,海思已经提供了类似的统计函数(我哭了) HI_S32 HI_MPI_IVE_Hist(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); 计算公式: 在使用前需要声明和初始化数组 IVE_DST_MEM_INFO_S stCount,使用完需要释放 在程序中的具体位置可以参阅海思Hi3519A开发(11.海思IVE使用模板总结(FILE->IVE->FILE)) //在 hiSAMPLE_IVE_SFD_S 结构体里里声明 IVE_DST_MEM_INFO_S stCount; //在 SAMPLE_IVE_Sfd_Uninit 函数里释放 IVE_MMZ_FREE(pstSfd->stCount.u64PhyAddr, pstSfd->stCount.u64VirAddr); //在 SAMPLE_IVE_Sfd_Init 函数里初始化 HI_U32 u32Size = IVE_HIST_NUM * sizeof(HI_U32); s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstSfd->stCount), u32Size); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, SFD_INIT_FAIL, "Error(%#x),Create Count mem info failed!\n", s32Ret); HI_MPI_IVE_Hist 的具体使用,输入为统计用的数组 stCount 和待测试图片 pstImg,返回值为灰度值为255的像素个数。 static HI_U32 SAMPLE_IVE_Count(IVE_DST_MEM_INFO_S stCount, IVE_SRC_IMAGE_S *pstImg) { HI_S32 s32Ret; HI_U32 Num; HI_U32* pu32Count; IVE_HANDLE IveHandle; HI_BOOL bBlock = HI_TRUE; HI_BOOL bFinish = HI_FALSE; s32Ret = HI_MPI_IVE_Hist(&IveHandle, pstImg, &stCount, HI_TRUE); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),HI_MPI_IVE_Hist failed!\n",s32Ret); s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); while (HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) { s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); } SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),HI_MPI_IVE_Query failed!\n",s32Ret); pu32Count = SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_U32, stCount.u64VirAddr); Num = *(pu32Count + 255); return Num; } 使用举例 HI_U32 CntNonZero; CntNonZero = SAMPLE_IVE_Count(pstSfd->stCount, &pstSfd->FgImg); 2019-12-310 0 2627 -
null 在3519上实现LBP目录 (Table of Contents) [TOCM] 1 背景 LBP 计算示意图 LBP 计算公式 2 主要程序 编辑 sample_ive_lbp.c 给 sample_ive_main.c 添加内容 给 sample_ive_main.h 添加内容 3 测试 编译程序 准备图片 测试 1 背景 LBP 计算示意图 LBP 计算公式 IVE_LBP_CMP_NORMAL IVE_LBP_CMP_ABS 其中 I(x, y) 对应 pstSrc , lpb(x, y) 对应 pstDst ,thr 对应 pstLbpCtrl→ un8BitThr 。 2 主要程序 对 LBP 算子的使用主要是参考了win10下的 Hi3519A V100R001C02SPC010\SVP_PC\HiIVE_PC_V2.1.0.7_64bit\sample\LBP 目录下的程序,其实就是照葫芦画瓢咯。 编辑 sample_ive_lbp.c #include
#include #include #include #include #include #include #include #include #include #include #include #include #include #include "sample_comm_ive.h" typedef struct hiSAMPLE_IVE_LBP_S { IVE_SRC_IMAGE_S stSrc; //input frame IVE_DST_IMAGE_S stDst; //output frame FILE* pFpSrc; //read from pFpSrc FILE* pFpDst; //write to pFpDst }SAMPLE_IVE_LBP_S; static SAMPLE_IVE_LBP_S s_stLbp; static HI_VOID SAMPLE_IVE_Lbp_Uninit(SAMPLE_IVE_LBP_S *pstLbp) { IVE_MMZ_FREE(pstLbp->stSrc.au64PhyAddr[0], pstLbp->stSrc.au64VirAddr[0]); IVE_MMZ_FREE(pstLbp->stDst.au64PhyAddr[0], pstLbp->stDst.au64VirAddr[0]); IVE_CLOSE_FILE(pstLbp->pFpSrc); IVE_CLOSE_FILE(pstLbp->pFpDst); } static HI_S32 SAMPLE_IVE_Lbp_Init(SAMPLE_IVE_LBP_S *pstLbp, HI_U32 u32Width, HI_U32 u32Height, HI_CHAR *pchSrcFileName, HI_CHAR *pchDstFileName) { HI_S32 s32Ret = HI_SUCCESS; memset(pstLbp, 0, sizeof(SAMPLE_IVE_LBP_S)); s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstLbp->stSrc), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, LBP_INIT_FAIL, "Error(%#x),Create stSrc image failed!\n", s32Ret); s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstLbp->stDst), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, LBP_INIT_FAIL, "Error(%#x),Create stDst image failed!\n", s32Ret); s32Ret = HI_FAILURE; pstLbp->pFpSrc = fopen(pchSrcFileName, "rb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstLbp->pFpSrc, LBP_INIT_FAIL, "Error,Open file %s failed!\n", pchSrcFileName); pstLbp->pFpDst = fopen(pchDstFileName, "wb"); SAMPLE_CHECK_EXPR_GOTO(NULL == pstLbp->pFpDst, LBP_INIT_FAIL, "Error,Open file %s failed!\n", pchDstFileName); s32Ret = HI_SUCCESS; LBP_INIT_FAIL: if (HI_SUCCESS != s32Ret) { SAMPLE_IVE_Lbp_Uninit(pstLbp); } return s32Ret; } static HI_S32 SAMPLE_IVE_Lbp(IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstDst) { HI_S32 s32Ret; IVE_HANDLE IveHandle; IVE_LBP_CTRL_S stCtrl; memset(&stCtrl,0,sizeof(IVE_LBP_CTRL_S)); stCtrl.enMode = IVE_LBP_CMP_MODE_ABS; // stCtrl.enMode =IVE_LBP_CMP_MODE_NORMAL; stCtrl.un8BitThr.s8Val = 10; s32Ret = HI_MPI_IVE_LBP(&IveHandle, pstSrc, pstDst, &stCtrl, HI_FALSE); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),HI_MPI_IVE_Lbp failed!\n",s32Ret); return s32Ret; } static HI_S32 SAMPLE_IVE_LbpProc(SAMPLE_IVE_LBP_S *pstLbp) { HI_S32 s32Ret = HI_SUCCESS; s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstLbp->stSrc), pstLbp->pFpSrc); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),Read src file failed!\n",s32Ret); s32Ret = SAMPLE_IVE_Lbp(&pstLbp->stSrc, &pstLbp->stDst); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),SAMPLE_IVE_Lbp failed!\n",s32Ret); s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstLbp->stDst, pstLbp->pFpDst); SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret,"Error(%#x),write file failed!\n",s32Ret); return s32Ret; } HI_VOID SAMPLE_IVE_DoLbp(HI_VOID) { HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32Width = 720; HI_U32 u32Height = 576; HI_CHAR pchSrcFileName[500]; HI_CHAR pchDstFileName[500]; snprintf(pchSrcFileName, sizeof(pchSrcFileName), "./data/input/img/pic/720x576_penguin.yuv"); snprintf(pchDstFileName, sizeof(pchDstFileName), "./data/output/lbp/720x576.yuv"); memset(&s_stLbp,0,sizeof(s_stLbp)); SAMPLE_COMM_IVE_CheckIveMpiInit(); s32Ret = SAMPLE_IVE_Lbp_Init(&s_stLbp, u32Width, u32Height, pchSrcFileName, pchDstFileName); SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, LBP_FAIL, "Error(%#x),SAMPLE_IVE_Lbp_Init failed!\n", s32Ret); s32Ret = SAMPLE_IVE_LbpProc(&s_stLbp); if (HI_SUCCESS == s32Ret) { SAMPLE_PRT("Process success!\n"); } SAMPLE_IVE_Lbp_Uninit(&s_stLbp); memset(&s_stLbp,0,sizeof(s_stLbp)); LBP_FAIL: SAMPLE_COMM_IVE_IveMpiExit(); } 给 sample_ive_main.c 添加内容 在 svp/ive 目录下 case 'c': { SAMPLE_IVE_DoLbp(); } break; 给 sample_ive_main.h 添加内容 在 svp/ive/sample 目录下 /****************************************************************************** * function : show LBP sample ******************************************************************************/ HI_VOID SAMPLE_IVE_DoLbp(HI_VOID); 3 测试 编译程序 cd /nfs/mpp/sample make 然后报一大串 warning ... 准备图片 找到 Hi3519A V100R001C02SPC010\SVP_PC\HiIVE_PC_V2.1.0.7_64bit\sample\data\img\shitomasi 目录下的 penguin.jpg 然后按照海思Hi3519A开发(5.梳理海思文档与运行sample代码)将图片转换成 yuv 格式 测试 在 Hi3519A 上输入 ./sample_ive_main c /nfsroot/mpp/sample/svp/ive # ./sample_ive_main c time: 0.000170 s [LBPSample]-96: Process success! 最后是程序效果展示: 2019-12-280 0 2287 -
null 运行海思 sample 代码目录 (Table of Contents) [TOCM] 1 梳理文档 主要的文档 主要例程 关于 yuv 文件的工具 2 运行 sample 代码 编译 执行程序 1 梳理文档 唉,海思的文档真的是让人一言难尽...我也不多吐槽了,还是说说最近的体会吧。 大家作为开发者最关心 API 怎么用,海思也对应地提供了 API 参考文档和例程。 主要的文档 在 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\board\MPP 目录下的 HiMPP V4.0 媒体处理软件开发参考.pdf 以及在 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\board\SVP 目录下的 HiIVE API 参考.pdf 和 HiIVS API参考.pdf 大部分需要用到的 API 都在 IVE 中, IVS主要对应的是 Motion Detection(移动侦测)。 主要例程 在 Linux 中进入 Hi3519AV100_SDK_V2.0.1.0/smp/a53_linux/mpp/sample 目录,里面的文件大部分都和 MPP 有关系,我们需要例程的在 Hi3519AV100_SDK_V2.0.1.0/smp/a53_linux/mpp/sample/svp/ive 目录下。 sample_ive_main.c 主要有以下功能 printf("\t 0)BgModel,
:0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]).\n"); printf("\t 1)Gmm, :0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]).\n"); printf("\t 2)Occlusion detected.(VI->VPSS->IVE->VO_HDMI).\n"); printf("\t 3)Motion detected.(VI->VPSS->IVE->VGS->VO_HDMI).\n"); printf("\t 4)Canny, :0, part canny;1,complete canny.(FILE->IVE->FILE).\n"); printf("\t 5)Gmm2.(FILE->IVE->FILE).\n"); printf("\t 6)MemoryTest.(FILE->IVE->FILE).\n"); printf("\t 7)Sobel.(FILE->IVE->FILE).\n"); printf("\t 8)Ann.(FILE->IVE->STDIO).\n"); printf("\t 9)St Lk.(FILE->IVE->FILE).\n"); printf("\t a)Svm.(FILE->IVE->STDIO).\n"); printf("\t b)Cnn.(FILE->IVE->STDIO).\n"); 关于 yuv 文件的工具 海思的图片格式为 yuv,如果我们想测试自己的图片那就要把文件格式转换为 yuv 海思提供的代码 参考文档是在 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\pc\DEC_LIB 目录下的 MJPEG PC解码库软件API参考.pdf 对应的代码是 Hi3519A V100R001C02SPC010\Hi3519A V100R001C02SPC010\01.software\pc\DEC_LIB 目录下的 Hi_MJPEG_DEC_LIB_V1.0.0.6.rar ,程序的2个命令行参数分别是输入的文件名和输出的文件名。 使用 ffmpeg 参考文档 【[FFMPE系列](https://www.ebaina.com/articles/140000003068 "FFMPE系列")】之FFMPEG常用命令 安装 ffmpeg apt install ffmpeg 将 MP4 视频转换为 yuv 格式文件(如果有需要也可以把 gray 改成 yuv420p 等其他格式) ffmpeg -i 1920x1080.mp4 -s 1920x1080 -pix_fmt gray 1920x1080.yuv 播放 YUV 格式文件 ffplay -video_size 1920x1080 -pix_fmt gray -i 1920x1080.yuv 2 运行 sample 代码 编译 将 a53_linux 下的 mpp 目录全部复制到 nfs 服务器中。 执行以下命令: cd sample source /etc/profile export LC_ALL=C make 等待编译完成 在开发板上挂载 nfs mount -t nfs xxx.xxx.xxx.xxx:/nfs /nfsroot -o nolock (更新) 这个命令连接不是很稳定 换成mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 xxx.xxx.xxx.xxx:/nfs /mnt 板子加载驱动 cd /nfsroot/mpp/ko ./load3519av100 -i -sensor0 imx334 执行程序 cd /nfsroot/mpp/sample/svp/ive ./sample_ive_main 4 1 效果如下: /nfsroot/mpp/sample/svp/ive # ./sample_ive_main Usage : ./sample_ive_main [complete] [encode] [vo] index: 0)BgModel, :0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]). 1)Gmm, :0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]). 2)Occlusion detected.(VI->VPSS->IVE->VO_HDMI). 3)Motion detected.(VI->VPSS->IVE->VGS->VO_HDMI). 4)Canny, :0, part canny;1,complete canny.(FILE->IVE->FILE). 5)Gmm2.(FILE->IVE->FILE). 6)MemoryTest.(FILE->IVE->FILE). 7)Sobel.(FILE->IVE->FILE). 8)Ann.(FILE->IVE->STDIO). 9)St Lk.(FILE->IVE->FILE). a)Svm.(FILE->IVE->STDIO). b)Cnn.(FILE->IVE->STDIO). /nfsroot/mpp/sample/svp/ive # ./sample_ive_main 4 1 [SAMPLE_IVE_Canny]-219: Process success! 此时在 data/output/canny 里已经生成了经过边缘检测处理后的图像。 使用 yuvplayer 打开看一下效果 :D 2019-12-280 3 6330 -
null 交叉编译 opencv目录 (Table of Contents) [TOCM] 1 准备工作 2 设置 cmake 3 编译 4 移植 1 准备工作 在 ubuntu 上安装 cmake-gui sudo apt-get install cmake-gui 下载opencv及contrib源代码到虚拟机 opencv下载 opencv_contrib下载 2 设置 cmake 创建文件夹 build_hi3519a,在该文件夹下创建文件夹 install 解压 opencv 压缩包 使交叉编译工具链生效 source /etc/profile export LC_ALL=C 命令行下输入: cmake-gui 填写你的 opencv 解压目录和刚刚创建的 build_hi3519a 目录地址 选择 Configure,之后选择第四个选项,点击 Next 设置如下,其中 C 和 C++ 内填交叉编译工具链地址,Target Root 先不填 点击 Finish 会 Configure 一直到成功 选择CMAKE_INSTALL_PREFIX。 install 是刚刚创建的,后面的 make install 会把编译好的opencv libs拷贝到该目录下 给 CMAKE_EXE_LINKER_FLAGS 加上参数 -lpthread -lrt -ldl 设置 CMAKE_FIND_ROOT_PATH 为交叉编译工具链的 bin 目录 勾选 BUILD_opencv_world 点击 Generate,等待完成 此时可以关闭 cmake-gui 界面 3 编译 进入之前解压的 opencv 源代码文件目录下 进入目录 cd 3rdparty/protobuf/src/google/protobuf/stubs 修改内容: vim common.cc 在头文件下添加内容: #define HAVE_PTHREAD 进入 build_hi3519a 目录下编译 make -j4 make install 编译完成后可以在 install 目录下看到 libopencv_world.so 文件 4 移植 将生成的 libopencv_world.so 文件拷贝到 /opt/hisi-linux/x86-arm/arm-himix200-linux/lib 目录下 精简 so 文件 arm-himix200-linux-strip libopencv_world.so 使用 ls -lh 可以看出现在 libopencv_world.so 已经明显变小 复制精简后的libopencv_world.so 到开发板的 /lib 目录下 最后检验是否成功 创建 demo.cpp 文件 #include
#include #include #include #include using namespace cv; using namespace std; int main() { Mat image(200, 150, CV_8UC1); for (int i = 0; i < image.rows; i++) { uchar* p = image.ptr (i); for (int j = 0; j < image.cols; j++) { if (i < 80 && i>50) { p[j] = 0; } else { p[j] = 255; } } } imwrite("demo.jpg", image); return 0; } 交叉编译命令 arm-himix200-linux-g++ -Wno-psabi -I /home/build_hi3519a/install/include/opencv4/ -L /home/build_hi3519a/install/lib/ -lopencv_world -lpthread -lrt -ldl -o demo demo.cpp 将可执行文件 demo 复制到开发板,执行生成 demo.jpg 文件 复制 demo.jpg 到虚拟机查看 2019-12-280 0 5484 -
目录 (Table of Contents) [TOCM] 2 uboot 下烧录内核与文件系统 3 设置网络 1 使用HiTool工具烧录uboot 这一章仅供参考!!!具体设置要视个人情况而定,不能直接套用本文内容 1 使用HiTool工具烧录uboot win10 下打开目录 Hi3519A V100R001C02SPC010\Hi3519A V100R001C02SPC010\01.software\pc\HiTool 解压 HiTool-BVT-5.0.46.zip 点击 HiTool.exe 设置如下: 选择串口(一般只有一个可选的) 传输方式选择串口 选择烧写Fastboot Flash类型选择spi nor 文件选择u-boot-hi3519av100.bin 此时给板子断电 点击烧写 在15秒内给板子上电 控制台出现successfully即为烧写完成 重新上电,重启板子 2 uboot 下烧录内核与文件系统 关于 TFTP 和终端工具可以参考win10目录 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\pc\HiTool 下的 HiTool工具平台 使用指南.pdf 的 3.3 TFTP视图和3.4 终端工具内容进行设置。也可以使用自己已经搭建好的 TFTP服务器和终端工具。 打开终端输入如下命令: //设置IP setenv serverip xxx.xxx.xxx.xxx setenv ipaddr xxx.xxx.xxx.xxx save //烧录内核,21000000 要看你板子的内存设置 mw.b 21000000 ff 400000;tftp 21000000 uImage sf probe 0;sf erase 100000 400000;sf write 21000000 100000 400000 //烧录文件系统,1B00000 要视文件系统具体情况 mw.b 21000000 ff 1B00000;tftp 21000000 rootfs_hi3519av100_64k.jffs2 sf probe 0;sf erase 500000 1B00000;sf write 21000000 500000 1B00000 //设置环境变量 setenv bootargs 'mem=256M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock2 rw rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs)' setenv bootcmd 'sf probe 0;sf read 21000000 100000 400000; bootm 21000000' save //重启 reset 重启过后就进入系统了 3 设置网络 可以通过如下方法让 Hi3519A 开启时自动配置好网络 在终端命令行下输入: cd /etc/init.d/ 创建一个新的文件 vim demo 输入内容: #!/bin/sh ifconfig eth0 192.168.1.108 netmask 255.255.255.0;route add default gw 192.168.1.1 这里的 192.168.1.108 可以改成你需要的 IP,保存并退出。 修改 rcS文件内容: vim rcS 在最后一行加上刚刚创建的文件 demo 的目录,修改后的 rcS文件内容如下: #! /bin/sh /bin/mount -a echo " _ _ _ _ _ _ _ _ _ _ _ _ \ _ _ _ _ _ ___ / /__/ \ |_/ / __ / - _ ___ / / / / / / _ _ _ _/ / / \_/ \_ ______ ___________\___\__________________ " for initscript in /etc/init.d/S[0-9][0-9]* do if [ -x $initscript ] ; then echo "[RCS]: $initscript" $initscript fi done /etc/init.d/demo 保存并退出,重启 reboot 现在就可以看到系统自动设置网络了2019-12-280 0 2774
-
null 编译uboot 和 kernel目录 (Table of Contents) [TOCM] 1 编译 uboot 2 编译 kernel 下载内核源码 打补丁 编译 kernel 3 SDK 提供的 uboot、kernel、rootfs 参考文章 首先必须要注意和强调的是:如果你使用的是华为原厂的板子才能使用SDK里提供的uboot和kernel 如果以前没有编译过uboot或kernel,请参考 https://blog.csdn.net/weixin_38180645/article/details/82856407 完成编译环境配置 1 编译 uboot 进入目录 Hi3519AV100_SDK_V2.0.1.0/osdrv/opensource/uboot 解压文件 tar -xzf u-boot-2016.11.tgz cd u-boot-2016.11 编译 uboot ,执行如下命令 cp configs/hi3519av100_defconfig .config make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig make ARCH=arm CROSS_COMPILE=arm-himix200-linux- cp ../../../tools/pc/uboot_tools/reg_info.bin .reg make ARCH=arm CROSS_COMPILE=arm-himix200-linux- u-boot-z.bin 将生成可用的 u-boot-hi3519av100.bin 镜像文件 可选用的配置文件如下: hi3519av100_defconfig hi3519av100_mmc_defconfig hi3519av100_nand_defconfig 2 编译 kernel 下载内核源码 从linux开源社区下载v4.9.37版本的内核,具体可以参考上一篇文章海思Hi3519A开发(1.搭建开发环境) 打补丁 将下载的 linux-4.9.37.tar.gz 存放到 osdrv/opensource/kernel 目录中 进入 osdrv 的根目录,执行如下命令: cd opensource/kernel tar -zxf linux-4.9.37.tar.gz mv linux-4.9.37 linux-4.9.y cd linux-4.9.y patch -p1 < ../linux-4.9.37.patch cd ../ tar -czf linux-4.9.y.tgz linux-4.9.y cd ../../ 注意: 若下载的内核格式为 linux-4.9.37.tar.xz, 第一步先用:xz -d linux-4.9.37.tar.xz 命令将 linux-4.9.37.tar.xz 解压为 linux-4.9.37.tar 第二步再用:tar -xvf linux-4.9.37.tar 解压 linux-4.9.37.tar 最后 kernel 目录下文件如下: 编译 kernel 进入 osdrv/opensource/kernel/linux-4.9.y 目录 执行如下命令: cp arch/arm/configs/hi3519av100_smp_defconfig .config sudo apt-get install u-boot-tools make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage 可选用的配置文件如下: hi3519av100_amp_defconfig hi3519av100_amp_emmc_defconfig hi3519av100_amp_nand_defconfig hi3519av100_smp_defconfig hi3519av100_smp_emmc_defconfig hi3519av100_smp_nand_defconfig 生成的 uImage 在 linux-4.9.y/arch/arm/boot 目录下 3 SDK 提供的 uboot、kernel、rootfs 如果你实在是懒得编译,海思还很贴心的提供了编译好的镜像文件。 在目录 Hi3519AV100_SDK_V2.0.1.0/smp_image_glibc 下,不仅有 uboot.bin 和 uImage ,还提供了各个版本的 roootfs 参考文章 Ubuntu18.0.4上编译Hi3519AV100 uboot和kernel ubuntu18.04 编译内核 学习记录2019-12-280 0 3468
-
null sample 内容介绍目录 (Table of Contents) [TOCM] sample_venc(视频数据编码) sample_vdec(视频数据解码) sample_audio(音频相关) sample_snap(拍照) sample_dpu_main(Depth Process Unit,深度图) sample_avs(Any View Stitching,全景拼接) sample_fisheye(鱼眼模式) sample_vio(视频输入输出) sample_vgs(Video Graphics Sub-System,视频图形子系统) sample_tde(Two Dimensional Engine,利用硬件为OSD和GUI提供快速的图形绘制功能) sample_hifb(Hisilicon Framebuffer,基于Linux FB 基本功能扩展了一些图形层控制功能) sample_awb_calibration(自动白光平衡测量) sample_ive_main(智能加速引擎) sample_dis(Digital Image Stabilization,数字稳像) sample_dsp_main(DSP测试) sample_nnie_main(神经网络硬件加速单元测试) sample_venc(视频数据编码) # ./sample_venc Usage : ./sample_venc [index] index: 0) H.265e@4K@120fps + H264e@1080p@30fps. 1) H.265e@4K@60fps + H264e@4K@60fp. 2) Lowdelay:H.265e@4K@30fps. 3) IntraRefresh:H.265e@4K@60fps + H264e@4K@60fps. 4) Qpmap:H.265e@4K + H264e@4K@60fps. 5) Mjpeg@4K@60fps +Jpeg@4K. shell 说明: 运行sample_venc (录制) 视频编码样例 使用方法: ./sample_venc [index] 参数<索引> 0) h265编码,4096×2160分辨率,每秒120帧 + h264编码,1920x1080分辨率,每秒30帧 1) h265编码,4096×2160分辨率,每秒60帧 + h264编码,4096×2160分辨率,每秒60帧 2) Lowdelay(低延时属性):h265编码,4096×2160分辨率,每秒30帧 3) IntraRefresh(P 帧帧内刷新):h265编码,4096×2160分辨率,每秒60帧 + h264编码,4096×2160分辨率,每秒60帧 4) Qpmap(是一种码率控制模式):h265编码,4096×2160分辨率 + h264编码,4096×2160分辨率,每秒60帧 5) Mjpeg(Mjpeg协议编码方式)的4096×2160分辨率,每秒60帧 + Jpeg(Jpeg的编码)的4096×2160分辨率 sample_vdec(视频数据解码) # ./sample_vdec Usage : ./sample_vdec
index: 0) VDEC(H265)-VPSS-VO 1) VDEC(H264)-VPSS-VO 2) VDEC(JPEG->YUV)-VPSS-VO 3) VDEC(JPEG->RGB) IntfSync : 0) VO HDMI 4K@30fps. 1) VO HDMI 1080P@30fps. shell 说明: 运行sample_vdec (播放) 视频解码样例 使用提示: ./sample_vdec <索引> 参数<索引>: 0) VDEC解码器输入(H265的编码格式图片/视频)--->VPSS(视频输入缓存块)--->VO(图片/视频输出) 1) VDEC解码器输入(H264的编码格式图片/视频)--->VPSS(视频输入缓存块)--->VO(图片/视频输出) 2) VDEC解码器输入(JPEG数据)--->VPSS(视频输入缓存块)--->VO(YUV图片/视频输出) 3) VDEC解码器输入JPEG解码成RGB数据 参数\ \: 0) 输出到HDMI 4096×2160分辨率,每秒30帧 1) 输出到HDMI 1920x1080分辨率,每秒30帧 sample_audio(音频相关) # ./sample_audio /Usage:./sample_audio / index and its function list below 0: start AI to AO loop 1: send audio frame to AENC channel from AI, save them 2: read audio stream from file, decode and send AO 3: start AI(VQE process), then send to AO 4: start AI to AO(Hdmi) loop 5: start AI to AO(Syschn) loop 6: start AI to Extern Resampler channel: 0: mic0 input 1: mic1 input shell 说明: 运行sample_audio 音频 (编码/解码)样例 使用提示:./sample_audio <索引> 以下内容是索引对应的功能 0) 循环音频从输入到输出 (话筒功能) 1) 通过音频输入发送音频帧到音频编码通道,保存起来 (录音功能) 2) 从文件读取音频流,解码然后发送到输出 (播放功能) 3) 通过音频输入声音质量增强处理,然后输出音频 (话筒功能) 4) 循环音频输入到HDMI通道音频输出 (话筒功能) 5) 循环音频输入到系统音通道音频输出 (话筒功能) 6) 通过音频输入重新采样 (录音功能) 音频输入通道 0) mic0输入(HeadPhone) 1) mic1输入(插针) sample_snap(拍照) # ./sample_snap Usage : ./sample_snap index: 0)double pipe offline, normal snap. shell 说明: 运行sample_snap 拍照 使用说明:./sample_snap <索引> 参数<索引> 0)双 pipe 离线模式普通拍照 sample_dpu_main(Depth Process Unit,深度图) # ./sample_dpu_main Usage : ./sample_dpu_main index: 0) VI->VPSS->RECT->MATCH. 1) FILE->RECT->MATCH. shell 说明: 运行 sample_dpu_main 使用方法:./sample_dpu_main <索引> <索引> 0) DPU(Depth Process Unit)对输入的左图像和右图像经过校正和匹配计算得出深度图 1) DPU(Depth Process Unit)对读取的文件的左图像和右图像经过校正和匹配计算得出深度图 sample_avs(Any View Stitching,全景拼接) # ./sample_avs Usage : ./sample_avs index: 0) 2 fisheye stitching, Normal projection. 1) 4 fisheye stitching, Cube map. 2) 4 pic no blend stitching. 3) 2 fisheye stitching, Image stabilizing. 4) Generate lut. shell 说明: 运行 sample_avs 使用说明: ./sample_avs \ \ 0) 2个CAM 鱼眼拼接正常显示模式 1) 4个CAM 鱼眼拼接呈现立体显示效果 2) 4个CAM 图片无混合拼接 3) 目前暂不支持 4)生成LUT表 sample_fisheye(鱼眼模式) # ./sample_fisheye Usage : ./sample_fisheye index: 0) fisheye 360 panorama 2 half with ceiling mount. 1) fisheye 360 panorama and 2 normal PTZ with desktop mount. 2) fisheye 180 panorama and 2 normal dynamic PTZ with wall mount. 3) fisheye source picture and 3 normal PTZ with wall mount. 4) nine_lattice preview(Only images larger than or equal to 8M are supported). vo intf: 0) vo HDMI output, default. 1) vo BT1120 output. venc type: 0) H265, default. 1) H264. shell 说明: 运行 ./sample_fisheye 使用说明 ./sample_fisheye \ \ \ index: 0) 2个“半顶装模式”的鱼眼360°全景视频 1) 2个普通“地装的PTZ”鱼眼360°全景视频 2) 2个普通“壁装的PTZ”鱼眼180°全景视频 3) 三个鱼眼原画的普通PTZ 壁装视频 4) 九格预览视频(仅支持大于或等于8m的图像) vo intf: 0) 默认HDMI输出 1) BT1120输出 venc type: 0) 默认H265编码 1) H264编码 sample_vio(视频输入输出) # ./sample_vio_main Usage : ./sample_vio_main index: 0)VI(Online) - VPSS(Online) - VO. 1)VI(Offline)- VPSS(Offline) - VO. LDC+DIS+SPREAD. 2)VI(Offline)- VPSS(Online) - VO. Double pipe. 3)VI(Online)- VPSS(Offline) - VO. Double chn. 4)Resolute Ratio Switch. 5)GDC - VPSS LowDelay. 6)Double WDR Pipe. 7)FPN Calibrate & Correction. 8)WDR Switch. 9)90/180/270 Rotate. 10)Mipi Demux Yuv. 11)UserPic. intf: 0) vo HDMI output, default. 1) vo BT1120 output. shell 说明: 运行 sample_vio 使用方法:./sample_vio_main \ \ index: 0) 在线输入--> 在线视频处理 -->输出 1) 离线输入--> 离线视频处理 -->输出 镜头畸变校正视频防抖和展宽 2) 离线输入--> 在线视频处理 -->输出 双管道 3) 在线输入--> 离线视频处理 -->输出 双通道 4) Resolute Ratio Switch 5) 几何畸变矫正 -->视频处理 低延时 6) 双WDR管道 7) FPN标定&矫正 8) WDR 开关 9) 90/180/270 旋转 10) Mipi Demux Yuv 11) 设置用户图片 intf: 0) 默认HDMI输出 1) BT1120输出 sample_vgs(Video Graphics Sub-System,视频图形子系统) # ./sample_vgs Usage: ./sample_vgs index: 0) FILE -> VGS(Scale) -> FILE. 1) FILE -> VGS(Cover+OSD) -> FILE. 2) FILE -> VGS(DrawLine) -> FILE. 3) FILE -> VGS(Rotate) -> FILE. shell 说明: 运行 sample_vgs 使用说明:./sample_vgs \ \ index: 0) 文件--> 视频图像子系统(缩放) -->文件 1) 文件--> 视频图像子系统(Cover+OSD) -->文件 2) 文件--> 视频图像子系统(画线) -->文件 3) 文件--> 视频图像子系统(旋转) -->文件 sample_tde(Two Dimensional Engine,利用硬件为OSD和GUI提供快速的图形绘制功能) # ./sample_tde Usage : ./sample_tde intf: 0) vo BT1120 output, default. 1) vo HDMI output. shell 说明: 运行 sample_tde 使用说明:./sample_tde \ intf: 0) 默认BT1120输出演示 1) HDMI输出演示 sample_hifb(Hisilicon Framebuffer,基于Linux FB 基本功能扩展了一些图形层控制功能) # ./sample_hifb Usage : ./sample_hifb /****************index******************/ please choose the case which you want to run: 0: ARGB8888 standard mode 1: ARGB1555 BUF_DOUBLE mode 2: ARGB1555 BUF_ONE mode 3: ARGB1555 BUF_NONE mode 4: ARGB1555 BUF_ONE mode with compress 5: ARGB8888 BUF_ONE mode with compress /****************device******************/ 0) VO device 0#, default. 1) VO device 1#. /****************intf******************/ 0) VO HDMI output, default. 1) VO BT1120 output. shell 说明: 运行 sample_hifb 使用说明:./sample_hifb \ \ \ \ 请选择一下您想运行的情况之一 0: ARGB8888像素格式标准模式 1: ARGB1555像素格式双缓存模式 2: ARGB1555像素格式单缓存模式 3: ARGB1555像素格式无缓存模式 4: ARGB1555像素格式带压缩的单缓存模式 5: ARGB8888像素格式带压缩的单缓存模式 \ 0) 默认输出到超清显示设备DHD0 1) 输出到高清显示设备DHD1(暂未支持) \ 0) 默认HDMI输出 1) BT1120输出(暂未支持) sample_awb_calibration(自动白光平衡测量) # ./sample_awb_calibration Usage : ./sample_awb_calibration mode: 0) Calculate Sample gain. 1) Adjust Sample gain according to Golden Sample. intf1: The value of Rgain of Golden Sample. 深红色区域的锐化增益控制。 intf2: The value of Bgain of Golden Sample. intf3: The value of Alpha ranging from 0 to 1024 (The strength of adusting Sampe Gain will increase with the value of Alpha) . shell 说明: 运行 sample_awb_calibration 使用方法:./sample_awb_calibration \ \ \ \ \ 0) 计算例子中的增益 1) 根据标准例子来校正例子中的增益 intf1: 标准例子中的深红色区域的锐化增益控制值 intf2: 标准例子中的深蓝色区域的锐化增益控制值 intf3: 0~1024范围的初始值(采样数据的增益强度会随着初始值的值增加而增加) sample_ive_main(智能加速引擎) ~ # ./sample_ive_main Usage : ./sample_ive_main [complete] [encode] [vo] index: 0)BgModel, :0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]). 1)Gmm, :0, not encode;1,encode. :0,not call vo;1,call vo.(VI->VPSS->IVE->VGS->[VENC_H264]->[VO_HDMI]). 2)Occlusion detected.(VI->VPSS->IVE->VO_HDMI). 3)Motion detected.(VI->VPSS->IVE->VGS->VO_HDMI). 4)Canny, :0, part canny;1,complete canny.(FILE->IVE->FILE). 5)Gmm2.(FILE->IVE->FILE). 6)MemoryTest.(FILE->IVE->FILE). 7)Sobel.(FILE->IVE->FILE). 8)Ann.(FILE->IVE->STDIO). 9)St Lk.(FILE->IVE->FILE). a)Svm.(FILE->IVE->STDIO). b)Cnn.(FILE->IVE->STDIO). shell 说明: 运行 sample_ive_main 使用说明: ./sample_ive_main \ [complete] [encode] [vo] index: 0) 背景模型 1) 高斯模型Gmm 2) 遮挡检测 3) 运动检测 4) 边缘检测 5) 高斯模型Gmm2 6) 内存测试 7) Sobel算子分割 8) 图像检索Ann 9) St和LK光流法 a) 分类器SVM b) 神经网络Cnn sample_dis(Digital Image Stabilization,数字稳像) # ./sample_dis Usage : ./sample_dis index: 0)DIS-4DOF_GME.VI-VO VENC. 1)DIS-6DOF_GME.VI-VO VENC. intf: 0) vo HDMI output, default. 1) vo BT1120 output. shell 说明: 运行 sample_dis 使用说明: ./sample_dis \ \ index: 0) DIS-4DOF_GME(四自由度 GME 算法,不使用陀螺仪),输入-输出 同时H256格式录像(存储在当前) 1) DIS-6DOF_GME(六自由度 GME 算法,不使用陀螺仪),输入-输出 同时H256格式录像(存储在当前) intf: 0) HDMI 输出 1) BT1120 输出 sample_dsp_main(DSP测试) ~ # ./sample_dsp_main shell 说明: 四个DSP之DSP0的出图测试。 sample_nnie_main(神经网络硬件加速单元测试) 神经网络,特别是深度学习卷积神经网络进行加速处理的硬件单元测试。 # ./sample_nnie_main Usage : ./sample_nnie_main index: 0) RFCN(VI->VPSS->NNIE->VGS->VO). 1) Segnet(Read File). 2) FasterRcnnAlexnet(Read File). 3) FasterRcnnDoubleRoiPooling(Read File). 4) Cnn(Read File). 5) SSD(Read File). 6) Yolov1(Read File). 7) Yolov2(Read File). 8) LSTM(Read File). 9)Pvanet(Read File). a) Rfcn(Read File). shell 说明: 运行 sample_nnie_main 使用说明: ./sample_nnie_main \ index: 0) RFCN模型 1) 可训练的图像分割Segnet 2) 深度学习的目标检测Alexnet 3) 深度学习的目标检测DoubleRoiPooling 4) 神经网络Cnn 5) 可训练的SSD模型处理 6) 神经网格模型Yolov1 7) 神经网格模型Yolov2 8) LSTM模型 9) Pvanet网络 a) Rfcn目标检测 2019-12-280 0 5390 -
null 搭建海思开发环境工作环境:Win10 + VM14 + Ubuntu18.04 1 下载 SDK 和 Kernel SDK来源 最好选用供应商提供的 SDK 包 其次可以选择网络资源易百纳论坛 http://bbs.ebaina.com/forum-97-1.html SDK 大小大概在10GB,下载到win10中 Kernel下载 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ 打开网页后找到 linux-4.9.37.tar.gz 下载到虚拟机中 SDK 内容介绍 下载好的 SDK 文件夹中应该有8个压缩包 我们解压其中的 arm-himix200-linux.part1.rar( part2 会跟着自动解压 ) 、 Hi3519A V100R001 C02SPC010.rar 、 ReleaseDoc.rar 其中 arm-himix200-linux.tgz 是交叉编译工具链,ReleaseDoc.rar 是开发手册, Hi3519A V100R001 C02SPC010.rar 是软件包 拷贝arm-himix200-linux.tgz 和 Hi3519A V100R001C02SPC010\Hi3519A V100R001C02SPC010\01.software\board 下的 Hi3519AV100_SDK_V2.0.1.0.tgz 到虚拟机中 2 安装交叉编译工具链 打开 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\board\OS 下的 Hi3519AV100╱Hi3556AV100 开发环境用户指南.pdf 、Hi3519AV100╱Hi3556AV100 U-boot 移植应用开发指南.pdf 打开 Hi3519A V100R001C02SPC010\ReleaseDoc\zh\01.software\board 下的 Hi3519AV100 SDK 安装及升级使用说明.pdf 解压交叉编译工具链 tar -xzf arm-himix200-linux.tgz 进入目录 cd arm-himix200-linux 安装交叉编译工具链(需要root权限) chmod +x arm-himix200-linux.install ./arm-himix200-linux.install 注意 如果要使用交叉编译工具链,需要在命令行输入 source /etc/profile export LC_ALL=C这两条指令 等待五六分钟这样,安装完毕。验证是否安装成功 source /etc/profile export LC_ALL=C arm-himix200-linux-gcc -v which arm-himix200-linux-gcc 为了使用方便,我们修改一下 ~/.bashrc 的内容,添加内容如下 export PATH=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin:$PATH export LC_ALL=C export LANG=en_US.UTF-8 export LANGUAGE= export LC_CTYPE="en_US.UTF-8" export LC_NUMERIC=zh_CN.UTF-8 export LC_TIME=zh_CN.UTF-8 export LC_COLLATE="en_US.UTF-8" export LC_MONETARY=zh_CN.UTF-8 export LC_MESSAGES="en_US.UTF-8" export LC_PAPER=zh_CN.UTF-8 export LC_NAME=zh_CN.UTF-8 export LC_ADDRESS=zh_CN.UTF-8 export LC_TELEPHONE=zh_CN.UTF-8 export LC_MEASUREMENT=zh_CN.UTF-8 export LC_IDENTIFICATION=zh_CN.UTF-8 3 解压安装 SDK 软件包 解压软件包 tar -zxf Hi3519AV100_SDK_V2.0.1.0.tgz 进入目录 cd Hi3519AV100_SDK_V2.0.1.0 展开软件包内容 vim sdk.unpack 修改第一行为 #!/bin/bash ,保存并退出 vim scripts/common.sh 修改第一行为 #!/bin/bash ,保存并退出 使交叉编译工具链生效 source /etc/profile export LC_ALL=C 使用root权限运行sdk.unpack ./sdk.unpack 等待安装完成 SDK 目录介绍2019-12-161 0 4498

共10条