RV1126+OPENCV在視頻中添加LOGO圖像

一.RV1126+OPENCV在視頻中添加LOGO圖像大體流程圖

主要是利用RV1126的視頻流結合OPENCV的API在視頻流里面添加LOGO圖像,換言之就是在RV1126的視頻流里面疊加圖片。大體流程我們來看上圖,要完成這個功能我們需要創建兩個線程(實際上還有初始化過程,這里先忽略了),第一個線程是opencv_vi_logo_handle_thread它主要是獲取VI原始數據并有OPENCV轉換成Mat矩陣然后添加LOGO圖像,并把VI數據發送到VENC編碼器。

第二個線程是get_venc_stream_thread它主要是獲取H264的VENC碼流數據,并且保存到H264文件

二.具體代碼實現

上圖我們已經說了大概的流程圖,這部分我們重點講解代碼的實現


2.1. RV1126模塊初始化并啟動VI工作

2.2VENC模塊初始化

我們之前的很多實戰都沒有使用這個函數開啟視頻流,那是因為很多時候VI模塊我們都與其他模塊綁定了,所以不需要,這里我們并沒有和任何模塊綁定,需要開啟這個

上面代碼是RV1126模塊的初始化,包括VI模塊的初始化(RK_MPI_VI_SetChnAttr)、使能VI模塊(RK_MPI_VI_EnableChn)、VENC模塊的初始化(RK_MPI_VENC_CreateChn)、啟動VI工作(RK_MPI_VI_StartStream)。關于這方面的參數設置,我們就不詳細說了,因為這方面的內容之前的課程已經詳細說過。

2.3創建線程

2.4 創建opencv_vi_logo_handle_thread線程?

上面是opencv_vi_logo_handle_thread的具體實現。

1.我們要通過imread讀取圖片

2.把圖片cvtColor轉換成灰度圖片

(由于VI模塊的圖像格式是NV12,所以我們的圖片必須要以灰度圖的方式進行添加)。

3.調用RK_MPI_SYS_GetMediaBuffer獲取每一幀的VI視頻原始數據

#4.使用OPENCV的API把每一個視頻數據轉換成Mat矩陣

具體的操作是:

Mat rv1126_img_mat = Mat(HEIGHT, WIDTH, CV_8UC1, RK_MPI_MB_GetPtr(mb)),

K_MPI_MB_GetPtr(mb)?是一個函數調用,返回一個指向內存塊的指針

mb?是一個媒體緩沖區對象(Media Buffer)

這個構造函數直接使用外部內存,而不是為矩陣分配新內存

函數原型:
Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
參數含義:
rows:矩陣的行數(HEIGHT)
cols:矩陣的列數(WIDTH)
type:矩陣的數據類型(CV_8UC1)
data:指向數據的指針(RK_MPI_MB_GetPtr (mb))
step:每行數據的字節數(默認為 AUTO_STEP,自動計算)

通過Mat的構造器,就可以把RV1126的VI視頻數據轉換成Mat,轉換成Mat之后,我們就需要對Mat進行圖層疊加操作。

5.Mat疊加操作

需要分兩步

第一步:先創建一個感興趣區域

Mat rv1126_img_mat_roi=rv1126_img_mat(Rect(100,100, logo_img.cols, logo_img.rows))

這個感性區域的長寬要與logo圖片的一致

第二步:利用copyTo函數把讀取的圖片拷貝到感興趣區域rv1126_img_mat_roi

?具體代碼是logo_img.copyTo(rv1126_img_mat_roi)

6.要把RV1126疊加過后的視頻VI數據發送到H264的VENC編碼器

調用的API是RK_MPI_SYS_SendMediaBuffer

2.4?創建get_venc_stream_thread線程?

上面是get_venc_stream_thread的具體實現,在這個線程里面要通過RK_MPI_SYS_GetMediaBuffer獲取每一幀H264的編碼數據,然后用fwrite寫入。

2.5?輸出結果:

經過上面的編碼后,我們來看看輸出的H264文件。可以看到這個H264文件,嵌入了JPG圖片。這個效果就實現了用OPENCV圖片疊加的功能對RV1126的視頻流進行圖片LOGO的添加
?

int ret;VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH;        // Pathvi_chn_attr.u32Width = WIDTH;                 // Widthvi_chn_attr.u32Height = HEIGHT;               // 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 = WIDTH;venc_chn_attr.stVencAttr.u32PicHeight = HEIGHT;venc_chn_attr.stVencAttr.u32VirWidth = WIDTH;venc_chn_attr.stVencAttr.u32VirHeight = HEIGHT;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 = WIDTH * HEIGHT * 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);}

三.小結

在做這個功能的時候遇到了挺多問題,比例提示什么gop數據過大啥的,然后一直在重復檢查修改參數,但是還是不行,最后弄了一晚上也找不出哪里有問題。今天早上重新來弄的時候,先用了其他功能的代碼在板子上運行,說vi模塊無法打開,這時候才意識到是板子連接出現了問題,應該是網線接口不緊的問題。

所以遇到問題,首先檢查代碼是沒問題的,如果檢查了代碼,代碼的配置的每一步都與自己所用所學對得上,這時候就不要一股腦的找代碼問題了,雖然報錯是說代碼哪里配置錯誤,但也有可能是硬件設備連接等問題的錯誤導致代碼報錯。

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

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

相關文章

汽車制造通信革新:網關模塊讓EtherCAT成功對接CCLINK

?在現代工業自動化生產領域,不同品牌和類型的設備往往采用不同的通信協議,這給設備之間的互聯互通帶來了挑戰。某汽車制造企業的生產線上,采用了三菱FX5U PLC作為主站進行整體生產流程的控制和調度,同時配備了庫卡機器人作為從站…

vue父類跳轉到子類帶參數,跳轉完成后去掉參數

當通過路由導航的時候,由于父類頁面帶參數到子類,導致路徑上面有參數 這樣不僅不美觀,而且在點擊導航菜單按鈕時還會有各種問題,這時我們只需要將路由后面的參數去掉就好了,在子頁面mounted()函數里面獲取到父類的參數…

純 CSS 實現的的3種掃光效果

介紹一個比較常見的動畫效果。 在日常開發中,為了強調凸顯某些文本或者元素,會加一些掃光動效,起到吸引眼球的效果,比如文本的 或者是一個卡片容器,里面可能是圖片或者文本或者任意元素 除此之外,還有那…

如何在FastAPI中構建一個既安全又靈活的多層級權限系統?

title: 如何在FastAPI中構建一個既安全又靈活的多層級權限系統? date: 2025/06/14 12:43:05 updated: 2025/06/14 12:43:05 author: cmdragon excerpt: FastAPI通過依賴注入系統和OAuth2、JWT等安全方案,支持構建多層級權限系統。系統設計包括基于角色的訪問控制、細粒度權…

大模型_Ubuntu24.04安裝RagFlow_使用hyper-v虛擬機_超級詳細--人工智能工作筆記0251

因為之前使用dify搭建了一個知識庫,但是dify的效果,尤其是在文檔解析方面是非常不友好的,雖然測試了,納米的效果非常好,但是納米只能容納2000個文件,如果 你的知識庫中有代碼,sql文件等等&…

LeetCode - LCR 173. 點名

題目 LCR 173. 點名 - 力扣(LeetCode) 思路 首先對數組進行排序,使學號按順序排列 在排序后的數組中,如果沒有缺失的學號,那么每個元素應該等于其索引值 使用二分查找找到第一個不等于其索引的元素位置&#xff1…

VSCode如何優雅的debug python文件,包括外部命令uv run main.py等等

debug程序的方式有很多種。每一種方式都各有缺點:有的方式雖然優雅,但是局限性很大;有的方式麻煩,但是局限性小。 常規方式: 優點:然后可以觀察所有線程。一勞永逸。缺點:就是寫參數很麻煩,但是你可以讓chatgpt等大模型幫你寫。最最最優雅的方式: 優點:就是需要在代碼…

[調試技巧]VS Code如何在代理模式下使用 MCP 工具?

在開發環境調試MCP,通過agent模式與大模型對話,并不能保證每次均正確調用tool。在閱讀官方文檔之后,得知以下小技巧。 添加 MCP 服務器后,您可以在代理模式下使用它提供的工具。要在代理模式下使用 MCP 工具 打開聊天視圖 (CtrlAl…

京東零售基于Flink的推薦系統智能數據體系 |Flink Forward Asia 峰會實錄分享

京東推薦系統的數據體系極其復雜,從召回、模型到策略和效果評估,每個環節都需要強大的海量數據處理能力支撐。然而,在實際運行中,整個數據鏈路面臨著諸多挑戰:如實時與離線數據的埋點口徑不一致、數倉模型存在偏差、計…

[學習] 牛頓迭代法:從數學原理到實戰

牛頓迭代法:從數學原理到實戰 ——高效求解方程根的數值方法 文章目錄 牛頓迭代法:從數學原理到實戰一、引言:為什么需要牛頓迭代法?二、數學原理:幾何直觀與公式推導1. **核心思想**2. **幾何解釋**3. **收斂性分析*…

使用 Git 將本地倉庫上傳到 GitHub 倉庫的完整指南

使用 Git 將本地倉庫上傳到 GitHub 倉庫的完整指南 一、引言 在現代軟件開發中,版本控制工具 Git 已成為不可或缺的一部分。GitHub 作為全球最大的代碼托管平臺,為開發者提供了代碼協作、項目管理和開源貢獻的便捷方式。本文將詳細介紹如何通過 Git 將本…

數據結構 - 棧與隊列

棧:限定僅在表尾進行插入或刪除操作的線性表。 表尾端有特殊含義,稱為棧頂(top)。 相應的,表頭端稱為棧底(buttom)。不含元素的空表成為空棧。 棧又稱為后進先出的線性表(Last In…

jojojojojo

《JOJO的奇妙冒險》是由日本漫畫家荒木飛呂彥所著漫畫。漫畫于1987年至2004年在集英社的少年漫畫雜志少年JUMP上連載(1987年12號刊-2004年47號刊),2005年后在集英社青年漫畫雜志Ultra Jumphttps://baike.baidu.com/item/Ultra%20Jump/2222322…

統計學核心概念與現實應用精解(偏機器學習)

統計學聽起來似乎很復雜,但其實它的核心就是兩個概念:概率分布和期望。這兩個概念就像是我們日常生活中的決策助手。 概率分布描述了隨機事件各種可能結果出現的可能性大小。比如,擲骰子時每個點數出現的概率,這就是一個典型的概…

go-carbon v2.6.8 發布,輕量級、語義化、對開發者友好的 golang 時間處理庫

carbon 是一個輕量級、語義化、對開發者友好的 Golang 時間處理庫,提供了對時間穿越、時間差值、時間極值、時間判斷、星座、星座、農歷、儒略日 / 簡化儒略日、波斯歷 / 伊朗歷的支持。 carbon 目前已捐贈給 dromara 開源組織,已被 awesome-go 收錄&am…

228永磁同步電機無速度算法--基于雙重鎖相環的滑模觀測器

一、原理介紹 在傳統的正交鎖相環的基礎上,利用前述濾波器、ZOH、代數環等非理想因素對電流信號進行延遲重構,進而得到一個與實際電流信號存在相位偏差的重構信號,且該相位偏差等同于初步估計位置信號與實際位置信號之間的相位偏差。將該重構…

零基礎入門 線性代數

線性代數是一種代數結構,通俗來講,向量空間是這個結構的基石,我們要在向量空間中研究向量與向量的關系 一 對象:向量 各位都有對象嘛?如果沒有對象,想不想知道你們的天命之人是誰捏?如果有對象…

IO之cout格式控制

目錄 簡單了解cout是什么? 什么是字節流 默認格式控制 修改計數系統 調整字符寬度 填充字符 設置浮點數顯示精度 打印末尾的0和小數點 其他格式控制符 right--->設置為右對齊,永久生效 left--->設置為左對齊,永久生效 fixed--…

探索鑄鐵試驗平臺在制造行業的卓越價值

鑄鐵試驗平臺在制造行業中具有重要的價值和作用。以下是鑄鐵試驗平臺在制造行業中的卓越價值: 提高產品質量:鑄鐵試驗平臺可以模擬各種生產條件和環境,并對鑄鐵產品進行精確的測試和評估。通過實驗平臺的測試,可以發現產品在不同條…

gpt3大模型蒸餾后效果會變差么

模型蒸餾(Model Distillation)是將復雜的 “教師模型”(如 GPT-3)的知識遷移到更輕量級的 “學生模型” 上的技術。蒸餾后的模型效果是否會變差,取決于多種因素,不能一概而論。以下是詳細分析: …