His读取图片的整理

该博客详细介绍了如何使用IVE模块处理图片,包括从VPSS获取帧、图像缩放、内存拷贝、颜色通道分离及合并、ARCTERN面部检测与跟踪,并通过Websocket发送结果的过程。代码中涉及了内存管理、图像处理和性能计时。
摘要由CSDN通过智能技术生成

static HI_VOID* SAMPLE_SVP_NNIE_ViToVo_IVEColorU8C3Face(HI_VOID* pArgs)
{
    #ifdef _REFRASH_PRINT_ 
        auto t1 = std::chrono::steady_clock::now();
        auto t2 = std::chrono::steady_clock::now();
    #endif
    #ifdef _ALL_TIME_PRINT_
        float avg_time_all = 0.1f;
    #endif
    HI_S32 s32Ret;
    VIDEO_FRAME_INFO_S stExtFrmInfo;//stExtFrmInfo转为CIF(352x288)分辨率
    HI_S32 s32MilliSec = -1;//-1; //阻塞模式
    HI_S32 s32VpssGrp = 0;
    HI_S32 as32VpssChn[] = {VPSS_CHN0, VPSS_CHN1};//, VPSS_CHN1
    int frame_idx = 0;
    stExtFrmInfo.u32PoolId = VB_INVALID_POOLID;

    int img_width =  416;//960;
    int img_height = 416;//544; 
    HI_S32 resize_size_width = 416; 
    HI_S32 resize_size_height = 416;
  
    //云天sdk参数设置
    arctern::ArcternManager manager(_LICENSE_FILE_);
    arctern::ObjectTrackerParameter tracker_parameter;
    tracker_parameter.single_tracker_type = "SLK";
    tracker_parameter.ive_input_img_width = img_width;
    tracker_parameter.ive_input_img_height = img_height;
    tracker_parameter.min_obj_size = 31;
    tracker_parameter.min_iou_threshold = 0.65;
    tracker_parameter.max_time_lost = 5;//lost时间,当过5帧还处于loss就丢掉此status
    int tarck_num = 5;
    
    //初始化 face_dect
    int result = 0;
    arctern::FaceDetectorParameter face_det_param;
    result += manager.set_face_det_model(_MODEL_BIN_,face_det_param); 
    result += manager.setup_optical_flow_tracker_faceFeatMatch01_params(tracker_parameter);
    if(!result){
        std::cout << "set model SUCCESS: " << result << std::endl; 
    }

    //webserver
    WebsockerService ws(8080);
    ws.StartService();
    
    //IVE模块
    // IVE_IMAGE_S img_8UC1;
    // IVE_IMAGE_S img_8UC1_resize;

    IVE_IMAGE_S img_8UC3planar_resize;
    HI_BOOL bInstant = HI_TRUE;
    HI_U32 u32Size = resize_size_width * resize_size_height;
    HI_U32 pImage_R[u32Size];
    HI_U32 pImage_G[u32Size];
    HI_U32 pImage_B[u32Size];
    int w_pad = 32;
    int h_pad = 200;
   
    // cv::Mat DstImage = cv::Mat::zeros(resize_size_height, resize_size_width, CV_8UC1);
   
    cv::Mat imageB;
    std::vector<cv::Mat> mbgr(3); 

    //时间初始化
    #ifdef _NEVER_PRINT_
        float avg_time_GetChnFrame = 0.1f;
        float avg_time_CreateImage = 0.1f;
        float avg_time_DmaImage_8UC1 = 0.1f;
        float avg_time_resize_8UC1 = 0.1f;
        float avg_time_arctern=0.1f;
        float avg_send_text=0.f;
        float avg_time_mbgr =0.1f;
        float avg_time_memcpy =0.1f;
    #endif


    //test pading
    #ifdef _TEST_PADING_
        char* pVBufVirt_Y;
        HI_U32 u32Size_img = 0;
        HI_U64  phy_addr;
        cv::Mat yuvImage;
    #endif
    // 1.创建目标图 
    // s32Ret = SAMPLE_COMM_IVE_CreateImage(&img_8UC1, IVE_IMAGE_TYPE_U8C1, 1920, 1080);
    // s32Ret = SAMPLE_COMM_IVE_CreateImage(&img_8UC1_resize, IVE_IMAGE_TYPE_U8C1, 416, 416);
    s32Ret = SAMPLE_COMM_IVE_CreateImage_8UC3planar(&img_8UC3planar_resize, IVE_IMAGE_TYPE_U8C3_PLANAR, 416, 416);
    while (HI_FALSE == s_bNnieStopSignal)
    {
        #ifdef _REFRASH_PRINT_ 
            std::cout <<"---"<< "frame:" <<frame_idx <<std::endl;
            t1 = std::chrono::steady_clock::now();
            std::cout << "\r" << std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t2).count() << " ms        " << std::flush;
            t2 = t1;
        #endif
        
        #ifdef _ALL_TIME_PRINT_
            struct timeval time_all_0,time_all_1;
            gettimeofday(&time_all_0,NULL);
        #endif

        #ifdef _NEVER_PRINT_ 
            struct timeval t_GetChnFrame_0,t_GetChnFrame_1;
            gettimeofday(&t_GetChnFrame_0,NULL);
        #endif
        s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, as32VpssChn[1], &stExtFrmInfo, s32MilliSec);  //1 路是小的
        if(HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("Error(%#x),HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d)!\n",
                s32Ret,s32VpssGrp, as32VpssCh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值