RV1126+OPENCV對視頻流單獨進行視頻膨脹/腐蝕操作

一.RV1126+OPENCV對視頻流進行視頻膨脹操作的大體流程圖

思路:初始化VI與VENC模塊,之后開啟兩個線程,一個線程從VI模塊獲取視頻流數據,用Opencv的Mat將其轉成Mat矩陣之后進行用dilate膨脹,將膨脹之后的視頻數據用send函數發送到venc中。另一個線程從venc中獲取數據之后進行保存處理。

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <opencv2/imgproc.hpp>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"#include <opencv2/core.hpp>
// #include <opencv2/imgoroc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define CAMERA_PATH "rkispp_scale0"
#define CAMERA_ID 0
#define CAMERA_CHN 0
#define VENC_CHN 0
#define WIDTH 1920
#define HEIGHT 1080void *opencv_vi_dliate_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, CAMERA_CHN, -1);//獲取VI數據if (!mb){printf("Get Vi stream break...\n");break;}Mat rv1126_vi_mat = Mat(HEIGHT, WIDTH, CV_8UC1, RK_MPI_MB_GetPtr(mb)); //把VI數據轉換成OPENCV的Mat矩陣Mat rv1126_vi_structure = getStructuringElement(MORPH_RECT, Size(15, 15));//獲取內核,內核的形狀是矩形,長度大小是15 * 15dilate(rv1126_vi_mat, rv1126_vi_mat, rv1126_vi_structure);//對Mat矩陣進行dilate膨脹RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, VENC_CHN, mb);//把膨脹后的數據傳輸到VENC編碼器RK_MPI_MB_ReleaseBuffer(mb);//釋放資源}return NULL;
}void *get_venc_stream_thread(void * args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;FILE *opencv_dliate_file = fopen("test_opencv_dliate.h264", "w+");while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, VENC_CHN, -1);if (!mb){printf("Get Venc stream break...\n");break;}printf("Get Dlite_Venc Stream Success...\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, opencv_dliate_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main()
{int ret;VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH;        // Pathvi_chn_attr.u32Width = 1920;                  // Widthvi_chn_attr.u32Height = 1080;                 // Heightvi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;       // ImageTypevi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP; // BufTypevi_chn_attr.u32BufCnt = 3;                    // Cntvi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL; // Moderet = RK_MPI_VI_SetChnAttr(CAMERA_ID, CAMERA_CHN, &vi_chn_attr);if (ret){printf("Vi Set Attr Failed.....\n");return 0;}else{printf("Vi Set Attr Success.....\n");}ret = RK_MPI_VI_EnableChn(CAMERA_ID, CAMERA_CHN);if (ret){printf("Vi Enable Attr Failed.....\n");return 0;}else{printf("Vi Enable Attr Success.....\n");}VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(VENC_CHN_ATTR_S));venc_chn_attr.stVencAttr.u32PicWidth = 1920;venc_chn_attr.stVencAttr.u32PicHeight = 1080;venc_chn_attr.stVencAttr.u32VirWidth = 1920;venc_chn_attr.stVencAttr.u32VirHeight = 1080;venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;venc_chn_attr.stVencAttr.u32Profile = 66;venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 1920 * 1080 * 3;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;ret = RK_MPI_VENC_CreateChn(VENC_CHN, &venc_chn_attr);if (ret){printf("ERROR: Create venc failed!\n");exit(0);}ret = RK_MPI_VI_StartStream(CAMERA_ID, CAMERA_CHN);if (ret){printf("start vi stream failed.....\n");}else{printf("start vi stream success.....\n");}pthread_t pid;pthread_create(&pid, NULL, opencv_vi_dliate_thread, NULL);//膨脹處理線程pthread_create(&pid, NULL, get_venc_stream_thread, NULL);//獲取VENC線程while (1){sleep(2);}RK_MPI_VENC_DestroyChn(VENC_CHN);RK_MPI_VI_DisableChn(CAMERA_ID, CAMERA_CHN);return 0;
}

二.RV1126+OPENCV對視頻流進行視頻腐蝕操作的大體流程圖

思路:初始化VI與VENC模塊,之后開啟兩個線程,一個線程從VI模塊獲取視頻流數據,用Opencv的Mat將其轉成Mat矩陣之后進行用dilate膨脹,將膨脹之后的視頻數據用send函數發送到venc中。另一個線程從venc中獲取數據之后進行保存處理。

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <opencv2/imgproc.hpp>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"#include <opencv2/core.hpp>
// #include <opencv2/imgoroc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define CAMERA_PATH "rkispp_scale0"
#define CAMERA_ID 0
#define CAMERA_CHN 0
#define VENC_CHN 0
#define WIDTH 1920
#define HEIGHT 1080void *opencv_vi_dliate_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, CAMERA_CHN, -1);//獲取VI數據if (!mb){printf("Get Vi stream break...\n");break;}Mat rv1126_vi_mat = Mat(HEIGHT, WIDTH, CV_8UC1, RK_MPI_MB_GetPtr(mb)); //把VI數據轉換成OPENCV的Mat矩陣Mat rv1126_vi_structure = getStructuringElement(MORPH_RECT, Size(15, 15));//獲取內核,內核的形狀是矩形,長度大小是15 * 15dilate(rv1126_vi_mat, rv1126_vi_mat, rv1126_vi_structure);//對Mat矩陣進行dilate膨脹RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, VENC_CHN, mb);//把膨脹后的數據傳輸到VENC編碼器RK_MPI_MB_ReleaseBuffer(mb);//釋放資源}return NULL;
}void *get_venc_stream_thread(void * args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb = NULL;FILE *opencv_dliate_file = fopen("test_opencv_dliate.h264", "w+");while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, VENC_CHN, -1);if (!mb){printf("Get Venc stream break...\n");break;}printf("Get Dlite_Venc Stream Success...\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, opencv_dliate_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main()
{int ret;VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH;        // Pathvi_chn_attr.u32Width = 1920;                  // Widthvi_chn_attr.u32Height = 1080;                 // Heightvi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;       // ImageTypevi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP; // BufTypevi_chn_attr.u32BufCnt = 3;                    // Cntvi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL; // Moderet = RK_MPI_VI_SetChnAttr(CAMERA_ID, CAMERA_CHN, &vi_chn_attr);if (ret){printf("Vi Set Attr Failed.....\n");return 0;}else{printf("Vi Set Attr Success.....\n");}ret = RK_MPI_VI_EnableChn(CAMERA_ID, CAMERA_CHN);if (ret){printf("Vi Enable Attr Failed.....\n");return 0;}else{printf("Vi Enable Attr Success.....\n");}VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(VENC_CHN_ATTR_S));venc_chn_attr.stVencAttr.u32PicWidth = 1920;venc_chn_attr.stVencAttr.u32PicHeight = 1080;venc_chn_attr.stVencAttr.u32VirWidth = 1920;venc_chn_attr.stVencAttr.u32VirHeight = 1080;venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;venc_chn_attr.stVencAttr.u32Profile = 66;venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 1920 * 1080 * 3;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;ret = RK_MPI_VENC_CreateChn(VENC_CHN, &venc_chn_attr);if (ret){printf("ERROR: Create venc failed!\n");exit(0);}ret = RK_MPI_VI_StartStream(CAMERA_ID, CAMERA_CHN);if (ret){printf("start vi stream failed.....\n");}else{printf("start vi stream success.....\n");}pthread_t pid;pthread_create(&pid, NULL, opencv_vi_dliate_thread, NULL);//膨脹處理線程pthread_create(&pid, NULL, get_venc_stream_thread, NULL);//獲取VENC線程while (1){sleep(2);}RK_MPI_VENC_DestroyChn(VENC_CHN);RK_MPI_VI_DisableChn(CAMERA_ID, CAMERA_CHN);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cordova + Vue 移動端視頻播放組件(支持 HLS + 原生播放器兜底)

在混合 App 中&#xff0c;移動端使用 標簽播放視頻經常踩坑&#xff0c;尤其是格式兼容、跨域限制、WebView 差異等問題。 本文介紹一個通用的 Cordova 視頻播放組件&#xff1a;優先 HTML5 播放&#xff0c;播放失敗自動提示用戶使用系統播放器&#xff0c;并支持原生插件兜底…

【Linux】掌握vim編譯器使用——詳細教程

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、Vim的三種核心模式解析 二、高效編輯核心命令大全 1. 光標快速導航 2. 文本編輯四連擊 3. 高效搜索替換 三、Vim神技&#xff1a;批量注釋與多文件編輯 1. 批量…

Oracle遷移瀚高,如何做表等對象與文件名一對一的文件腳本(APP)

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文檔用途 Oracle遷移到瀚高后&#xff0c;需要整理一張表對應一個與表同名的腳本&#xff0c;一個函數對應一個與函數同名的腳本 詳細信息 一、整理…

洞察分享 | 在萬物互聯的時代,如何強化網絡安全,更有效地保護工業基礎設施?

2025年&#xff0c;物聯網&#xff08;IoT&#xff09;與互聯系統已深度融入工業4.0的發展之中&#xff0c;同時也帶來了前所未有的網絡安全挑戰。隨著工業系統的互聯互通不斷加深&#xff0c;網絡攻擊的范圍和類型不斷增加&#xff0c;關鍵基礎設施因此面臨更高的網絡風險暴露…

k8s 1.23.6版本apiserver list-watch原理機制

Kubernetes 1.23.6 版本中&#xff0c;API Server 的 **List-Watch 機制** 是集群狀態同步的核心機制&#xff0c;其設計目標是高效、實時地將資源變更通知到各組件&#xff08;如 kubelet、controller-manager等&#xff09;。以下是其詳細原理和工作機制&#xff1a; 1. 核心…

Linux基本指令篇 —— mkdir指令

mkdir是Linux和Unix-like系統中用于創建目錄的基本命令&#xff0c;全稱為"make directory"。下面將詳細介紹這個命令的用法、選項和實際應用。 目錄 一、基本語法 二、基本用法 創建單個目錄 創建多個目錄 三、常用選項 -p 或 --parents -m 或 --mode -v 或 …

聊聊GPIO 工作模式

嵌入式開發中&#xff0c;GPIO&#xff08;General-Purpose Input/Output&#xff09;是最基礎也最常用的功能模塊之一。你可以把它想象成微控制器伸出來的無數根“手腳”&#xff1a;既可以用它輸出信號去點亮LED、驅動外設&#xff0c;也可以用它輸入信號來檢測按鍵、讀取傳感…

DM9000AE+STM32H7在rt-thread中的使用

概述 記錄下DM9000AE在rt-thread上的使用 FMC的配置 rt-thread的網絡設備驅動注冊 硬件連接 16bit總線 掛在FMC_A0 地址0x6000_0000 FMC的配置 FMC是STM32H7的一個外設&#xff0c;通過FMC把DM9000當做一個SRAM來訪問&#xff0c;只需要配置好FCM的時序就可以了。 DM9000…

TiDB 字符串行轉列與 JSON 數據查詢優化知識筆記

一、長字符串行轉列方案 JSON_TABLE 方案&#xff08;TiDB 5.0 推薦&#xff09; 通過將逗號分隔字符串轉為 JSON 數組后展開為行&#xff1a; sql SET str ‘a,b,c,d’; SELECT jt.val, jt.pos FROM JSON_TABLE( CONCAT(‘[’, REPLACE(str, ‘,’, ‘“,”’), ‘"]’…

1 Studying《Performance Analysis and Tuning on Modern CPUs》7-11

目錄 Part2. Source Code Tuning For CPU 數據驅動優化 7 CPU Front-End Optimizations 7.1 Machine code layout //機器碼布局 7.2 Basic Block 7.3 Basic block placement 7.4 Basic block alignment 7.5 Function splitting //函數拆分 7.6 Function groupin…

WinUI3入門6:子線程處理UI 窗口加載后執行 獲取和設置控件尺寸 自動生成事件代碼框架

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

中國招聘智能化白皮書:從 “人撐不住“ 到 “AI 破局“ 的底層邏輯革命——AI得賢招聘官第六代AI面試官

一場面試&#xff0c;牽動一家公司的人力系統。 當簡歷數量以千計堆疊、當HR通宵挑燈刷篩選、當面試質量與效率陷入兩難&#xff0c;招聘不再只是流程問題&#xff0c;而成了“組織生存”的關鍵變量。 問題是&#xff1a;靠人&#xff0c;已經撐不住了。 企業招聘正步入前所…

防爆型激光測距傳感器:危險環境中的安全守護者

在石油化工、煤礦開采、核電站等高危工業場景中&#xff0c;爆炸性氣體與粉塵的存在讓傳統測量設備望而卻步。而防爆型激光測距傳感器的出現&#xff0c;猶如為這些領域注入了一劑“安全強心針”&#xff0c;以毫米級精度與防爆雙重保障&#xff0c;重新定義了工業測量的安全邊…

【AI編程】PC的一個提示詞,生成網站首頁,模型gpt4.1 、deepseekv3和claude3.7對比,你更喜歡哪個?

AI提示詞&#xff1a; 角色 你是一位資深的前端工程師、設計師和插畫師 設計風格 優雅的極簡主義美學與功能的完美平衡; 清新柔和的漸變配色與品牌色系渾然一體; 恰到好處的留白設計; 輕盈通透的沉浸式體驗; 信息層級通過微妙的陰影過渡與模塊化卡片布局清晰呈現; 按鈕添加…

跟著AI學習C# Day12

&#x1f4c5; Day 12&#xff1a;LINQ&#xff08;Language Integrated Query&#xff09;基礎 ? 目標&#xff1a; 理解 LINQ 的基本概念和作用&#xff1b;掌握使用 LINQ 查詢集合&#xff08;如 List<T>、Array&#xff09;&#xff1b;學會使用常用 LINQ 方法&am…

ubuntu網絡管理五花八門netplan 、NetworkManager、systemd、networking是什么關系

文章目錄 **1. Netplan&#xff08;網絡配置抽象層&#xff09;****2. NetworkManager&#xff08;動態網絡管理&#xff09;****3. systemd-networkd&#xff08;輕量級網絡管理&#xff09;****4. networking&#xff08;傳統的 ifupdown&#xff09;****5. 它們之間的關系**…

Python爬蟲實戰:研究Twisted框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網信息的爆炸式增長,網絡爬蟲作為一種高效獲取和收集網絡信息的技術手段,在搜索引擎優化、市場調研、數據挖掘等領域有著廣泛的應用。傳統的同步爬蟲在面對大量 URL 請求時,由于 I/O 操作的阻塞特性,效率低下,難以滿足實際應用需求。…

內網運行控制四百來個海康威視硬件物聯網定員管控軟件(華為平板電腦版)

內網運行控制四百來個海康威視硬件物聯網定員管控軟件&#xff08;華為平板電腦版&#xff09; 從去年12月至今&#xff0c;自研一套在內網中的華為平板電腦上運行&#xff0c;控制四百來個海康威視硬件的物聯網定員管控軟件&#xff0c;開始上線投入運行。 運行環境為華為平板…

C++ 面向對象特性詳解:繼承機制

&#x1f680; C 面向對象特性詳解&#xff1a;繼承機制全解析——代碼復用與擴展的核心&#xff08;含實戰陷阱&#xff09; &#x1f4c5; 更新時間&#xff1a;2025年6月19日 &#x1f3f7;? 標簽&#xff1a;C | 繼承 | OOP | 面向對象 | 代碼復用 | C基礎 文章目錄 &…