瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用筆記

一、源碼

? ? ? ? 官方在librga中給了很多 demo 以供參考,例如 imresize 操作:

/** Copyright (C) 2022  Rockchip Electronics Co., Ltd.* Authors:*     YuQiaowei <cerf.yu@rock-chips.com>** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#define LOG_NDEBUG 0
#undef LOG_TAG
#define LOG_TAG "rga_resize_demo"#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <linux/stddef.h>#include "RgaUtils.h"
#include "im2d.hpp"#include "utils.h"#define LOCAL_FILE_PATH "/data"int main() {int ret = 0;int src_width, src_height, src_format;int dst_width, dst_height, dst_format;char *src_buf, *dst_buf;int src_buf_size, dst_buf_size;rga_buffer_t src_img, dst_img;rga_buffer_handle_t src_handle, dst_handle;memset(&src_img, 0, sizeof(src_img));memset(&dst_img, 0, sizeof(dst_img));src_width = 1280;src_height = 720;src_format = RK_FORMAT_RGBA_8888;dst_width = 1920;dst_height = 1080;dst_format = RK_FORMAT_RGBA_8888;src_buf_size = src_width * src_height * get_bpp_from_format(src_format);dst_buf_size = dst_width * dst_height * get_bpp_from_format(dst_format);src_buf = (char *)malloc(src_buf_size);dst_buf = (char *)malloc(dst_buf_size);/* fill image data */if (0 != read_image_from_file(src_buf, LOCAL_FILE_PATH, src_width, src_height, src_format, 0)) {printf("src image read err\n");draw_rgba(src_buf, src_width, src_height);}memset(dst_buf, 0x80, dst_buf_size);src_handle = importbuffer_virtualaddr(src_buf, src_buf_size);dst_handle = importbuffer_virtualaddr(dst_buf, dst_buf_size);if (src_handle == 0 || dst_handle == 0) {printf("importbuffer failed!\n");goto release_buffer;}src_img = wrapbuffer_handle(src_handle, src_width, src_height, src_format);dst_img = wrapbuffer_handle(dst_handle, dst_width, dst_height, dst_format);/** Scale up the src image to 1920*1080.--------------    ---------------------|            |    |                   ||  src_img   |    |     dst_img       ||            | => |                   |--------------    |                   ||                   |---------------------*/ret = imcheck(src_img, dst_img, {}, {});if (IM_STATUS_NOERROR != ret) {printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));return -1;}ret = imresize(src_img, dst_img);if (ret == IM_STATUS_SUCCESS) {printf("%s running success!\n", LOG_TAG);} else {printf("%s running failed, %s\n", LOG_TAG, imStrError((IM_STATUS)ret));goto release_buffer;}write_image_to_file(dst_buf, LOCAL_FILE_PATH, dst_width, dst_height, dst_format, 0);release_buffer:if (src_handle)releasebuffer_handle(src_handle);if (dst_handle)releasebuffer_handle(dst_handle);if (src_buf)free(src_buf);if (dst_buf)free(dst_buf);return ret;
}

二、移植使用

? ? ? ? 下面是我在移植進項目時的代碼:

/*** @Description: 直接內存映射圖像數據,圖像的生命周期由用戶管理* @param {Mat} &image: 輸入的源圖像,使用 OpenCV 的 Mat 結構表示* @param {Mat} &resized_image: 輸出的目標圖像,經過縮放處理后的圖像* @return {*} 返回 0 表示成功*/
int RGA_resize(const cv::Mat &image, cv::Mat &resized_image)
{if (image.type() != CV_8UC3) // 8位無符號三通道彩色圖像{printf("source image type is %d!\n", image.type());return -1;}rga_buffer_t src_img;rga_buffer_t dst_img;size_t img_width = image.cols;size_t img_height = image.rows;size_t target_width = resized_image.cols;size_t target_height = resized_image.rows;memset(&src_img, 0, sizeof(src_img));memset(&dst_img, 0, sizeof(dst_img));// 將源圖像和目標圖像的數據填充至 rga_buffer_t 結構體(函數內部就是填充 rga_buffer_t)// 該函數用于用戶自己管理的圖像內存// OpenCV 的 MAT 格式為 RGB888,沒有 A 通道src_img = wrapbuffer_virtualaddr((void *)image.data, img_width, img_height, RK_FORMAT_RGB_888);// 創建的 RGA 緩沖區,它直接引用了 resized_image.data 的內存地址,這意味著 dst_img 和 resized_image 共享同一塊內存dst_img = wrapbuffer_virtualaddr((void *)resized_image.data, target_width, target_height, RK_FORMAT_RGB_888);// 在配置完畢RGA任務參數后,可以通過該接口校驗當前參數是否合法,并根據當前硬件情況判斷硬件是否支持// src_img	[required] input imageA// dst_img	[required] output image// srect	[required] src_img crop region// drect	[required] dst_img crop region// 建議該接口僅在開發調試階段使用,避免多次校驗導致性能損耗IM_STATUS STATUS;/*STATUS = imcheck(src_img, dst_img, src_rect, dst_rect);if (IM_STATUS_NOERROR != STATUS){fprintf(stderr, "rga check error! %s", imStrError(STATUS));return -1;}*/// 調?RGA實現快速圖像縮放操作,將 rga_buffer_t 格式的結構體src、dst傳?imresize()// dst_img 是 resized_imageSTATUS = imresize(src_img, dst_img);if (IM_STATUS_SUCCESS != STATUS) {fprintf(stderr, "rga resize error! %s", imStrError(STATUS));return -1;}// printf("resizing .... %s\n", imStrError(STATUS));return 0;
}

? ? ? ? 與官方 demo 不同的是,我這里使用?wrapbuffer_virtualaddr 接口來映射?rga_buffer_t 接口體,輸入輸出圖像的緩沖區需要用戶提前申請,而官方的 demo 則是將圖像放入?RGA 內部統一管理內存。

? ? ? ? 我在傳入 cv::Mat 對象進行圖像操作時,發現 resize 后的接收對象,需要提前定義好緩沖區和大小,否則 RGA 在執行時會報錯,也就是接收緩沖區不能是只申明的 cv::Mat 對象:

cv::Mat img;

可以根據需要在創建時就設置大小:

// 創建 rgb 空圖像
cv::Mat rgb_img(orig_img.rows, orig_img.cols, CV_8UC3);

也可以在使用前通過 create 設置大小:

// 創建需要 resize 的空圖像,這里只申明,不申請內存
cv::Mat resized_img;// 如果需要縮放,再對 resized_img 申請大小,節約內存開銷
resized_img.create(height, width, CV_8UC3);

三、其他

? ? ? ? 有關其他接口的筆記,移步:

瑞芯微RKRGA(librga)Buffer API 分析-CSDN博客https://blog.csdn.net/plmm__/article/details/146571080?spm=1001.2014.3001.5501

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

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

相關文章

Spring MVC:從歷史演變到實戰入門

1. Java Web的發展歷史與MVC模式 1.1 Model I與Model II的演進 Model I&#xff08;JSPJavaBean&#xff09; 作為早期Java Web開發的主流模式&#xff0c;其核心架構如下&#xff1a; graph LR A[客戶端] --> B[JSP頁面] B --> C{業務邏輯} C --> D[JavaBean] D -…

AI賦能,防御無界:群聯云防護如何顛覆傳統DDoS防御格局?

一、AI驅動的動態防御體系 智能流量調度 群聯云防護通過AI算法實時分析流量特征&#xff0c;動態分配清洗節點。當檢測到攻擊時&#xff0c;系統能在秒級內將流量切換至備用節點&#xff0c;避免單點過載。相較傳統高防IP依賴靜態規則&#xff0c;群聯的調度策略可減少50%的誤封…

R --- Error in library(***) : there is no package called ‘***’ (服務器非root用戶)

步驟 步驟一&#xff1a;在自己目錄下創建R包安裝路徑步驟二&#xff1a;配置用戶本地的R庫路徑步驟三&#xff1a;安裝缺失的包&#xff08;在終端&#xff09;步驟四&#xff1a;驗證安裝 步驟一&#xff1a;在自己目錄下創建R包安裝路徑 mkdir -p ~/R_libs步驟二&#xff1…

HarmonyOS NEXT狀態管理實踐

在HarmonyOS NEXT開發中&#xff0c;狀態管理是構建高效、響應式應用的核心。本文深入探討狀態管理的最佳實踐&#xff0c;結合代碼示例與案例分析&#xff0c;幫助開發者掌握這一關鍵技能。 一、狀態管理裝飾器的合理使用 HarmonyOS NEXT提供多種狀態管理裝飾器&#xff0c;…

excel 時間戳 轉日期

在Excel中&#xff0c;將時間戳轉換為日期格式&#xff0c;可以使用以下步驟和方法&#xff1a; 一、了解時間戳 時間戳&#xff08;Timestamp&#xff09;通常是從1970年1月1日&#xff08;UTC時間&#xff09;開始的秒數或毫秒數。這個時間點被稱為“Unix紀元”或“Unix時間…

Python CSV 數據分析:問題排查與解決全記錄

Python CSV 數據分析&#xff1a;問題排查與解決全記錄 前段時間&#xff0c;我接到一個任務&#xff0c;需要對公司的銷售數據進行分析。這些數據存儲在 CSV 文件里&#xff0c;本想著用 Python 處理起來會很輕松&#xff0c;結果卻狀況百出。下面&#xff0c;就跟大家講講我…

一些常用開發軟件下載地址

1. Matlab官方下載地址 MATLAB Runtime 是運行由 MATLAB 編譯的應用程序&#xff08;如 .exe、.jar 或 .dll&#xff09;所必需的組件&#xff0c;無需安裝完整 MATLAB。 &#x1f517; MathWorks 官方下載頁面&#xff1a; https://www.mathworks.com/products/compiler/mat…

06-SpringBoot3入門-常見注解(簡介)

1、Controller ResponseBody Controller是Spring MVC 中的注解&#xff0c;負責處理 HTTP 請求。 ResponseBody是Spring MVC 中的注解&#xff0c;用于直接將方法的返回值作為 HTTP 響應體。 2、RestController RestController Controller ResponseBody 3、RequestMappin…

ubuntu24.04.2 NVIDIA GeForce RTX 4060筆記本安裝驅動

https://www.nvidia.cn/drivers/details/242281/ 上面是下載地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 賦予執行權限把下載的驅動復制到家目錄下&#xff0c;基本工具準備&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …

【數據庫相關MySql、Redis、MongoDB】

一、三種數據庫的對比 MongoDB、MySQL 和 Redis 是三種不同類型的數據庫系統&#xff0c;它們在數據模型、存儲方式、性能特點、適用場景等方面存在顯著區別。以下是它們的詳細對比&#xff1a; 1. 數據模型 MySQL 類型&#xff1a;RDBMS&#xff08;關系型數據庫&#xff0…

《Express:Node.js 里的 “閃電俠”》

“你就坐在我身邊&#xff0c;好不好” 什么是Express 官方給出的概念&#xff1a;Express 是基于 Node.js 平臺&#xff0c;快速、開放、極簡的 Web 開發框架。 通俗的理解&#xff1a;Express 的作用和 Node.js 內置的 http 模塊類似&#xff0c;是專門用來創建 Web 服務器…

vue遺漏的知識點(動態組件.組件庫的操作使用)

----動態組件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的內置組件&#xff0c;用于動態渲染其他組件。:is 屬性 用于指定要渲染的組件。它的值可以是&#xff1a; 組件的名稱&#xff08;字符串&#xf…

vue 項目啟動報錯可以讓 cursor啟動

vue 項目啟動報錯可以讓 cursor啟動

SQL EXISTS 與 NOT EXISTS 運算符

EXISTS 和 NOT EXISTS 是 SQL 中的邏輯運算符&#xff0c;用于檢查子查詢是否返回任何行。它們通常用在 WHERE 子句中&#xff0c;與子查詢一起使用。 EXISTS 運算符 EXISTS 運算符用于檢查子查詢是否返回至少一行數據。如果子查詢返回任何行&#xff0c;EXISTS 返回 TRUE&…

Android設計模式之模板方法模式

一、定義&#xff1a; 定義一個操作中的算法的框架&#xff0c;而將一些步驟延遲到子類中&#xff0c;使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 二、結構&#xff1a; AbstractClass抽象類&#xff1a;定義算法的骨架&#xff0c;包含模板方法和若干…

Vue3當中el-tree樹形控件使用

tree懸停tooltip效果 文本過長超出展示省略號 如果文本超出懸停顯示tooltip效果 反之不顯示 這里直接控制固定寬度限制 試了監聽寬度沒效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…

QScreen 捕獲屏幕(截圖)

一、QScreen核心能力解析 硬件信息獲取 // 獲取主屏幕對象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 輸出屏幕參數 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…

PDF處理控件Aspose.PDF教程:通過C#、Java 和 Python刪除 PDF中的水印

Aspose.PDF 是一個功能強大的庫&#xff0c;旨在以編程方式處理 PDF 文檔&#xff0c;提供創建、編輯、轉換和操作的廣泛功能。它支持 C#、Java 和 Python 等多種編程語言&#xff0c;使開發人員能夠精確高效地自動處理 PDF。 對于開發人員來說&#xff0c;由于自動化和定制化…

基于STC89C51的太陽自動跟蹤系統的設計與實現—單片機控制步進電機實現太陽跟蹤控制(仿真+程序+原理圖+PCB+文檔)

摘 要 隨著我國經濟的飛速發展&#xff0c;促使各種能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油資源不斷消耗與短缺&#xff0c;因此人類尋找其他替代能源的腳步正在加快。而太陽能則具有無污染﹑可再生﹑儲量大等優點&#xff0c;且分布范圍廣&…

【硬件測試】基于FPGA的16QAM+幀同步系統開發與硬件片內測試,包含高斯信道,誤碼統計,可設置SNR

目錄 1.算法硬件測試效果 2.算法涉及理論知識概要 2.1 16QAM調制解調原理 2.2 幀同步 3.Verilog核心程序 4.開發板使用說明和如何移植不同的開發板 5.完整算法代碼文件獲得 1.算法硬件測試效果 本文是之前寫的文章: 《基于FPGA的16QAM幀同步系統verilog開發,包含testb…