opencv获取的图像mat 如何实现rstp进行推流

  • 您好,这是一个 luckfox-pico 使用 rtsp 推流人脸检测结果图像的例程,您可以参考一下
    https://github.com/luckfox-eng29/luckfo ... etinaface/
    目前使用的方案是 vi 与 vpss 连接,从 vpss 中获取一帧图像使用 opencv-mobile 处理后使用 RK_MPI_VENC_SendFrame 将帧数据上传到 venc 编码为 H264 再进行 rtsp 推流。
    您可以参考这个例程直接创建一个 VIDEO_FRAME_INFO_S 结构体将 opencv-mobile 获取的图像数据拷贝进去再上传到 venc 编码;
    本例程使用的 rtsp 推流方案使用的是瑞芯微官方提供的接口,对输入格式有需求也没有开放源码,您也可以采取使用其他 rtspsetver 方案,支持更多格式的输入。
  • 您好您这个demo试了一下,发现这个人脸识别推流的画面矩形框和识别有一点延迟效果可能不太好,想换成另一个rknn中demo里的物体识别的yolov5模型那个我记得在我的帖子上的demo中反应要比这个人脸识别要快很多,
    Image
    我发现两个模型的输出有一些不太一样这个应该会对输出有一定影响
    ,那您给的这个源代码需要更改哪些地方呢仅仅只用更改模型路径和名字吗还是要有其他的修改需要注意的?
    Attachments
    rknn模型对比.png
  • 另外我想实现给服务器进行推流但是运用到了rtsp_set_server_address(g_rtsplive, "IP"); 这个函数时在编译时报错应该是显示没有定义如下函数

    Code: Select all

    home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc: In function 'int main(int, char**)':
    /home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc:221:2: error: 'rtsp_set_server_address' was not declared in this scope
      rtsp_set_server_address(g_rtsplive, "172.32.0.93");  // set RTSP server IP 172.32.0.93
      ^~~~~~~~~~~~~~~~~~~~~~~
    /home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc:221:2: note: suggested alternative: 'rtsp_sever_tx_video'
      rtsp_set_server_address(g_rtsplive, "172.32.0.93");  // set RTSP server IP 172.32.0.93
      ^~~~~~~~~~~~~~~~~~~~~~~
    
    那如果我想要发送指定服务器还需要引进哪些库呢?
  • chenmodegaoyang wrote: 2024-02-22 4:04 您好您这个demo试了一下,发现这个人脸识别推流的画面矩形框和识别有一点延迟效果可能不太好,想换成另一个rknn中demo里的物体识别的yolov5模型那个我记得在我的帖子上的demo中反应要比这个人脸识别要快很多,
    Image
    我发现两个模型的输出有一些不太一样这个应该会对输出有一定影响
    ,那您给的这个源代码需要更改哪些地方呢仅仅只用更改模型路径和名字吗还是要有其他的修改需要注意的?
    您好,感谢您对了 luckfox-pico 在 rtsp 推流 rknn 模型推理图像问题的关注,目前我们对 rtsp 推流的例程还处于开发阶段,延迟效果是 rtsp 推流时受编解码,网络延迟等因素导致的,使用其他模型也会存在较为明显的延迟,目前的这个例程使用的 rtsp 配置还待优化,该例程主要为题主的问题提出参考思路。

    rknn 模型如果要进行修改还需要考虑到对模型输出数据进行解析,仅仅修改模型路径是无法顺利运行的。

    这个例程使用的模型 retinaface 是比较轻量的模型,在这个例程中仅用于测试 rknn 能否顺利运行。考虑到社区对物体识别模型的需求,我们也尝试加载 yolov5s 模型,但是在测试平台 luckfox-pico plus(主控RV1103)上受内存限制会在各模块的内存分配阶段就会失败,我们会进一步的优化,或者尝试其他更轻量的模型。
  • chenmodegaoyang wrote: 2024-02-22 4:13 另外我想实现给服务器进行推流但是运用到了rtsp_set_server_address(g_rtsplive, "IP"); 这个函数时在编译时报错应该是显示没有定义如下函数

    Code: Select all

    home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc: In function 'int main(int, char**)':
    /home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc:221:2: error: 'rtsp_set_server_address' was not declared in this scope
      rtsp_set_server_address(g_rtsplive, "172.32.0.93");  // set RTSP server IP 172.32.0.93
      ^~~~~~~~~~~~~~~~~~~~~~~
    /home/alientek/RV1106_ai_demo/luckfox_pico_rtsp_retinaface-master/src/rtsp_opencv.cc:221:2: note: suggested alternative: 'rtsp_sever_tx_video'
      rtsp_set_server_address(g_rtsplive, "172.32.0.93");  // set RTSP server IP 172.32.0.93
      ^~~~~~~~~~~~~~~~~~~~~~~
    
    那如果我想要发送指定服务器还需要引进哪些库呢?
    目前使用的 rtsp 推流接口基于瑞芯微官方的 rkrtsp.a 静态链接库,包含的软件接口如下
    rtsp_api.jpg
    不支持您需要的 rtsp_set_server_address ,如果有更多需求推荐使用其他的 rtspserver 库,瑞芯微官方没有提供相应的 rtsp 源码可以进行二次开发。
    该例程实现的效果是将 luckfox-pico 作为推流服务器,电脑端使用 vlc 打开网络串流 rtsp://172.32.0.93/live/0 即可观察到拉取的图像,ip 地址参考 https://wiki.luckfox.com/zh/Luckfox-Pico/CSI-Camera 进行配置。
  • Crocodile wrote: 2024-02-22 6:10
    chenmodegaoyang wrote: 2024-02-22 4:04 您好您这个demo试了一下,发现这个人脸识别推流的画面矩形框和识别有一点延迟效果可能不太好,想换成另一个rknn中demo里的物体识别的yolov5模型那个我记得在我的帖子上的demo中反应要比这个人脸识别要快很多,
    Image
    我发现两个模型的输出有一些不太一样这个应该会对输出有一定影响
    ,那您给的这个源代码需要更改哪些地方呢仅仅只用更改模型路径和名字吗还是要有其他的修改需要注意的?
    您好,感谢您对了 luckfox-pico 在 rtsp 推流 rknn 模型推理图像问题的关注,目前我们对 rtsp 推流的例程还处于开发阶段,延迟效果是 rtsp 推流时受编解码,网络延迟等因素导致的,使用其他模型也会存在较为明显的延迟,目前的这个例程使用的 rtsp 配置还待优化,该例程主要为题主的问题提出参考思路。

    rknn 模型如果要进行修改还需要考虑到对模型输出数据进行解析,仅仅修改模型路径是无法顺利运行的。

    这个例程使用的模型 retinaface 是比较轻量的模型,在这个例程中仅用于测试 rknn 能否顺利运行。考虑到社区对物体识别模型的需求,我们也尝试加载 yolov5s 模型,但是在测试平台 luckfox-pico plus(主控RV1103)上受内存限制会在各模块的内存分配阶段就会失败,我们会进一步的优化,或者尝试其他更轻量的模型。
    这个是我帖子下工作人员修改给出的基于官方rknpu下的YOLOV5物体识别不断输出打印结果的demo
    Image
    您好,我试了下直接替换确实不行因为yolov5物体识别有coco数据集的标签无法显示并且输出也不一样,导致矩形框会乱标,那如果想要将您新发布的这个人脸识别的demo中推流部分的代码移植到这个yolov5捕获视频帧的新demo中进行rtsp的物体识别处理后推流可以吗?结合您新发布的这个RTSP推流方法,就是将yolov5处理后的图片利用RK的函数去进行解码发送等操作进行发送到网络串流形成视频流,这种方案可行吗
    Attachments
    Crocodile.png
  • chenmodegaoyang wrote: 2024-02-22 8:04
    Crocodile wrote: 2024-02-22 6:10
    chenmodegaoyang wrote: 2024-02-22 4:04 您好您这个demo试了一下,发现这个人脸识别推流的画面矩形框和识别有一点延迟效果可能不太好,想换成另一个rknn中demo里的物体识别的yolov5模型那个我记得在我的帖子上的demo中反应要比这个人脸识别要快很多,
    Image
    我发现两个模型的输出有一些不太一样这个应该会对输出有一定影响
    ,那您给的这个源代码需要更改哪些地方呢仅仅只用更改模型路径和名字吗还是要有其他的修改需要注意的?
    您好,感谢您对了 luckfox-pico 在 rtsp 推流 rknn 模型推理图像问题的关注,目前我们对 rtsp 推流的例程还处于开发阶段,延迟效果是 rtsp 推流时受编解码,网络延迟等因素导致的,使用其他模型也会存在较为明显的延迟,目前的这个例程使用的 rtsp 配置还待优化,该例程主要为题主的问题提出参考思路。

    rknn 模型如果要进行修改还需要考虑到对模型输出数据进行解析,仅仅修改模型路径是无法顺利运行的。

    这个例程使用的模型 retinaface 是比较轻量的模型,在这个例程中仅用于测试 rknn 能否顺利运行。考虑到社区对物体识别模型的需求,我们也尝试加载 yolov5s 模型,但是在测试平台 luckfox-pico plus(主控RV1103)上受内存限制会在各模块的内存分配阶段就会失败,我们会进一步的优化,或者尝试其他更轻量的模型。
    这个是我帖子下工作人员修改给出的基于官方rknpu下的YOLOV5物体识别不断输出打印结果的demo
    Image
    您好,我试了下直接替换确实不行因为yolov5物体识别有coco数据集的标签无法显示并且输出也不一样,导致矩形框会乱标,那如果想要将您新发布的这个人脸识别的demo中推流部分的代码移植到这个yolov5捕获视频帧的新demo中进行rtsp的物体识别处理后推流可以吗?结合您新发布的这个RTSP推流方法,就是将yolov5处理后的图片利用RK的函数去进行解码发送等操作进行发送到网络串流形成视频流,这种方案可行吗

    您好,感谢您对社区的关注,这是一个还处于开发阶段的例程 https://github.com/luckfox-eng29/luckfo ... tsp_yolov5。您可以进行参考学习。
    请注意在 viewtopic.php?t=486 中提供的例程仅为题主对 CMake 编译研究的参考,最新的 RKNN 使用请参考 https://github.com/airockchip/rknn_model_zoo 使用,优化了老版本的一些问题。
  • Crocodile wrote: 2024-02-22 2:10 您好,这是一个 luckfox-pico 使用 rtsp 推流人脸检测结果图像的例程,您可以参考一下
    https://github.com/luckfox-eng29/luckfo ... etinaface/
    目前使用的方案是 vi 与 vpss 连接,从 vpss 中获取一帧图像使用 opencv-mobile 处理后使用 RK_MPI_VENC_SendFrame 将帧数据上传到 venc 编码为 H264 再进行 rtsp 推流。
    您可以参考这个例程直接创建一个 VIDEO_FRAME_INFO_S 结构体将 opencv-mobile 获取的图像数据拷贝进去再上传到 venc 编码;
    本例程使用的 rtsp 推流方案使用的是瑞芯微官方提供的接口,对输入格式有需求也没有开放源码,您也可以采取使用其他 rtspsetver 方案,支持更多格式的输入。
    如何创建一个 VIDEO_FRAME_INFO_S 结构体将 opencv-mobile 获取的图像数据拷贝进去再上传到 venc 编码?我这不行
    Last edited by W凯先森~ on 2024-02-26 5:22, edited 1 time in total.
  • W凯先森~ wrote: 2024-02-26 4:31
    Crocodile wrote: 2024-02-22 2:10 您好,这是一个 luckfox-pico 使用 rtsp 推流人脸检测结果图像的例程,您可以参考一下
    https://github.com/luckfox-eng29/luckfo ... etinaface/
    目前使用的方案是 vi 与 vpss 连接,从 vpss 中获取一帧图像使用 opencv-mobile 处理后使用 RK_MPI_VENC_SendFrame 将帧数据上传到 venc 编码为 H264 再进行 rtsp 推流。
    您可以参考这个例程直接创建一个 VIDEO_FRAME_INFO_S 结构体将 opencv-mobile 获取的图像数据拷贝进去再上传到 venc 编码;
    本例程使用的 rtsp 推流方案使用的是瑞芯微官方提供的接口,对输入格式有需求也没有开放源码,您也可以采取使用其他 rtspsetver 方案,支持更多格式的输入。
    如何创建一个 VIDEO_FRAME_INFO_S 结构体将 opencv-mobile 获取的图像数据拷贝进去再上传到 venc 编码?我这不行
    您好,首先感谢您的尝试,瑞芯微的官方文档在构建 VIDEO_FRAME_INFO_S 结构体并没有提及太多的细节,经过我们的测试发现要使 VIDEO_FRAME_INFO_S 能够被 VENC 模块成功获取需要确保 内存缓冲块 能够成功申请,您需要执行的步骤如下:

    1.构建一个内存缓冲池

    Code: Select all

    VIDEO_FRAME_INFO_S h264_frame;
    MB_POOL_CONFIG_S PoolCfg;
    memset(&PoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
    PoolCfg.u64MBSize = width*height*3 ;
    PoolCfg.u32MBCnt = 1;
    PoolCfg.enAllocType = MB_ALLOC_TYPE_DMA;
    //PoolCfg.bPreAlloc = RK_FALSE;
    MB_POOL src_Pool = RK_MPI_MB_CreatePool(&PoolCfg);
    printf("Create Pool success !\n");	
    
    2.从内存缓冲池中获取缓冲块

    Code: Select all

    MB_BLK src_Blk = RK_MPI_MB_GetMB(src_Pool, width*height*3, RK_TRUE);
    
    3.将opencv获取到的图像转换为 RGB888 格式传入缓冲块的虚拟地址

    Code: Select all

    h264_frame.stVFrame.u32Width = 480;
    h264_frame.stVFrame.u32Height = 480;
    h264_frame.stVFrame.u32VirWidth = 480;
    h264_frame.stVFrame.u32VirHeight = 480;
    h264_frame.stVFrame.enPixelFormat =  RK_FMT_RGB888; 
    h264_frame.stVFrame.u32TimeRef = H264_TimeRef++;      //标识为第几帧
    h264_frame.stVFrame.u64PTS = TEST_COMM_GetNowUs(); //获取当前时间戳
    h264_frame.stVFrame.u32FrameFlag = 160;
    h264_frame.stVFrame.pMbBlk = src_Blk; 
    unsigned char *data = (unsigned char *)RK_MPI_MB_Handle2VirAddr(src_Blk);
    
    cap >> bgr;
    for (int y = 0; y < height; ++y) {
      for (int x = 0; x < width; ++x) {
    	  cv::Vec3b pixel = bgr.at<cv::Vec3b>(y, x);
    	  data[(y * width + x) * 3 + 0] = pixel[2]; // Red
    	  data[(y * width + x) * 3 + 1] = pixel[1]; // Green
    	  data[(y * width + x) * 3 + 2] = pixel[0]; // Blue
    	}
    }
    
    4.将创建的 VIDEO_FRAME_INFO_S 传入VENC中

    Code: Select all

    RK_MPI_VENC_SendFrame(0, &h264_frame,-1);
    
    RTSP推流设置方面与例程一样,我们会测试这种图像捕获方式与 RKMPI 库之间的性能表现,决定是否对例程进行更新。