中英文的网站设计,中国工业设计在线官网,wordpress主题设置备份,简易网址制作本专栏主要是提供一种国产化图像识别的解决方案#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。
B站配套视频#xff1a;https://www.bilibili.com/video/BV1or421T74f
前言…本专栏主要是提供一种国产化图像识别的解决方案专栏中实现了YOLOv5/v8在国产化芯片上的使用部署并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。
B站配套视频https://www.bilibili.com/video/BV1or421T74f
前言
在实际生产过程中有很多时候不光是通过网络获取rtsp视频流通常会采用在板子上插上USB摄像头获取画面。 今天我将向搭建演示该如何通过USB获取画面后推流出RTSP视频流。
本课程相关代码以开源在V8的项目中有开源链接的朋友可以重新拉取一下代码。
前期准备
首先我们需要确定一下基本原理usb的获取和推流到rtsp是这里面存在编码不一致的问题。
通常我们会采用opencv获取usb摄像头的画面然后进行推理这时候图像是RGB编码的。
而推流到RTSP中就变成了YUV编码那自然就会想到RK3588的固有能力硬件编码器MPP。
那RTSP的推流我们就选择官方推荐的ZLMediakit来实现。正题结构如下所示 #mermaid-svg-KYqRPVY2dj0UufyW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .error-icon{fill:#552222;}#mermaid-svg-KYqRPVY2dj0UufyW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KYqRPVY2dj0UufyW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-KYqRPVY2dj0UufyW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KYqRPVY2dj0UufyW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KYqRPVY2dj0UufyW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KYqRPVY2dj0UufyW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KYqRPVY2dj0UufyW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KYqRPVY2dj0UufyW .marker.cross{stroke:#333333;}#mermaid-svg-KYqRPVY2dj0UufyW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KYqRPVY2dj0UufyW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .cluster-label text{fill:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .cluster-label span{color:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .label text,#mermaid-svg-KYqRPVY2dj0UufyW span{fill:#333;color:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .node rect,#mermaid-svg-KYqRPVY2dj0UufyW .node circle,#mermaid-svg-KYqRPVY2dj0UufyW .node ellipse,#mermaid-svg-KYqRPVY2dj0UufyW .node polygon,#mermaid-svg-KYqRPVY2dj0UufyW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KYqRPVY2dj0UufyW .node .label{text-align:center;}#mermaid-svg-KYqRPVY2dj0UufyW .node.clickable{cursor:pointer;}#mermaid-svg-KYqRPVY2dj0UufyW .arrowheadPath{fill:#333333;}#mermaid-svg-KYqRPVY2dj0UufyW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KYqRPVY2dj0UufyW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KYqRPVY2dj0UufyW .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-KYqRPVY2dj0UufyW .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-KYqRPVY2dj0UufyW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KYqRPVY2dj0UufyW .cluster text{fill:#333;}#mermaid-svg-KYqRPVY2dj0UufyW .cluster span{color:#333;}#mermaid-svg-KYqRPVY2dj0UufyW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KYqRPVY2dj0UufyW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} opencv yolo mpp mpp ZLMediakit USB RGBimg 推理画面 YUVimg RTSP 下载和编译zlmediakit、mpp
代码讲解查看视频 https://www.bilibili.com/video/BV1or421T74f](https://www.bilibili.com/video/BV1or421T74f
cd ZLMediaKit
git submodule init
git submodule update
cmake . -B build cmake --build build -j4
cd ../mpp
cmake . -B build cmake --build build -j4
cp ./submodules/mpp/build/utils/libutils.a libs/
cp ./submodules/ZLMediaKit/release/linux/Debug/libmk_api.so libs/源码核心部分
int process_video_file(rknn_app_context_t *ctx, const char *video_path)
{// 读取视频cv::VideoCapture cap(video_path);if (!cap.isOpened()){printf(Failed to open video file: %s, video_path);}// 获取视频尺寸、帧率int cap_width cap.get(cv::CAP_PROP_FRAME_WIDTH);int cap_height cap.get(cv::CAP_PROP_FRAME_HEIGHT);int fps cap.get(cv::CAP_PROP_FPS);ctx-media mk_media_create(__defaultVhost__, ctx-push_path_first.c_str(), ctx-push_path_second.c_str(), 0, 0, 0);codec_args v_args {0};mk_track v_track mk_track_create(MKCodecH264, v_args);mk_media_init_track(ctx-media, v_track);mk_media_init_complete(ctx-media);mk_media_set_on_regist(ctx-media, on_mk_media_source_regist_func, ctx);// 初始化编码器MppEncoder *mpp_encoder new MppEncoder();MppEncoderParams enc_params;memset(enc_params, 0, sizeof(MppEncoderParams));enc_params.width cap_width;enc_params.height cap_height;enc_params.fmt MPP_FMT_YUV420SP;enc_params.type MPP_VIDEO_CodingAVC;mpp_encoder-Init(enc_params, ctx);ctx-encoder mpp_encoder;// mpp编码配置void *mpp_frame NULL;int mpp_frame_fd 0;void *mpp_frame_addr NULL;int enc_data_size;int frame_index 0;int ret 0;// 画面cv::Mat img;while (true){// 读取视频帧cap img;if (img.empty()){printf(Video end.);break;}frame_index;// 结束计时auto end_time std::chrono::high_resolution_clock::now();// 将当前时间点转换为毫秒级别的时间戳auto millis std::chrono::time_point_caststd::chrono::milliseconds(end_time).time_since_epoch().count();mpp_frame ctx-encoder-GetInputFrameBuffer();mpp_frame_fd ctx-encoder-GetInputFrameBufferFd(mpp_frame);mpp_frame_addr ctx-encoder-GetInputFrameBufferAddr(mpp_frame);rga_buffer_t src wrapbuffer_fd(mpp_frame_fd, cap_width, cap_height, RK_FORMAT_YCbCr_420_SP);int enc_buf_size ctx-encoder-GetFrameSize();char *enc_data (char *)malloc(enc_buf_size);rga_buffer_t rgb_img wrapbuffer_virtualaddr((void *)img.data, cap_width, cap_height, RK_FORMAT_BGR_888);// 将RGB图像复制到src中imcopy(rgb_img, src);if (frame_index 1){enc_data_size ctx-encoder-GetHeader(enc_data, enc_buf_size);}// 内存初始化memset(enc_data, 0, enc_buf_size);enc_data_size ctx-encoder-Encode(mpp_frame, enc_data, enc_buf_size);ret mk_media_input_h264(ctx-media, enc_data, enc_data_size, millis, millis);if (ret ! 1){printf(mk_media_input_frame failed\n);}}cap.release();
}
代码讲解查看视频https://www.bilibili.com/video/BV1or421T74f