rv1126 获取图像数据,实现图像裁剪、缩放、旋转【RK_MPI API接口】

本文介绍RK平台RGA功能的应用实例,演示如何通过RGA进行图像格式转换、缩放及旋转等操作。针对旋转功能未生效的问题,给出了详细的解决方案。

前言

  1. 刚接触RK平台,目前正在学习探索阶段,欢迎朋友们一起讨论,指出文章错误和可以优化的地方;
  2. 如果想参照文中描述进行编译、执行程序,请先参考阅读rv1126 SDK编译rv1126 数据流

版本说明,测试使用SDK版本是2020-0912版本,文中记录的问题,可能在新版本已经解决;文中使用的接口函数,可能老版本没有实现。
备注:后续重新购买了2020-1212版本SDK,旋转问题已经解决,不需要再修改源码。另外,编译时,需要多带上如下几个库:-lrknn_runtime -lod_share -lrockx -lOpenVX -lVSC -lGAL -lArchModelSw -lNNArchPerf


代码

直接上代码,代码将同一帧图像数据,利用RK平台的RGA功能,分别对图像进行了格式转换、缩放+旋转+格式转换、裁剪+格式转换,得到3路图像输出,并存储成文件。
代码是参考SDK包rv1126_1109/external/rkmedia/test/c_api/rkmedia_vi_rga_test.c修改而成。
说明:

  1. 编译后,执行可能遇到旋转效果无法实现,可以参考后续说明的方法修改;
  2. RK平台提供的接口,缩放图的长宽应该是要16的倍数,如果参照rv1126_1109/external/rkmedia/test/c_api/rkmedia_vi_rga_test.c里缩放输出960x540,会发现存储得到的图像数据有异常。修改输出尺寸为960x544后正常;
// Copyright 2020 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <assert.h>
#include <fcntl.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include <pthread.h>

//#include "common/sample_common.h"
#include "rkmedia_api.h"
#include "rkmedia_venc.h"

static bool quit = false;

// 信号处理程序
static void sigterm_handler(int sig)
{
   
   
    fprintf(stderr, "signal %d\n", sig);
    quit = true;
}

// 图像数据处理线程
static void *GetMediaBuffer(void *arg)
{
   
   
    RGA_CHN rga_chn = *(RGA_CHN *)arg;
    char save_path[512];

    //
    printf("#Start %s thread, rga_chn:%d\n", __func__, rga_chn);
    sprintf(save_path, "/userdata/output_%d.nv12", rga_chn);
    //
    FILE *save_file = fopen(save_path, "w");
    if (!save_file)
        printf("ERROR: Open %s failed!\n", save_path);

    MEDIA_BUFFER mb = NULL;
    int save_cnt = 0;
    int recv_len;
    while (!quit)
    {
   
   
        mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, rga_chn, 50);
        if (!mb)
        {
   
   
            if (!quit)
            {
   
   
                continue;
            }
            printf("chn-%d:RK_MPI_SYS_GetMediaBuffer get null buffer!\n", rga_chn);
            break;
        }

        recv_len = RK_MPI_MB_GetSize(mb);
        printf("Get Frame-chn-%d:ptr:%p, fd:%d, size:%zu, mode:%d, channel:%d, "
               "timestamp:%lld\n",
               rga_chn,
               RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetFD(mb), recv_len,
               RK_MPI_MB_GetModeID(mb
<think>好的,我现在需要分析用户提供的代码片段,并回答相关问题。首先,用户展示的代码看起来是针对Rockchip RV1126RV1109平台的AI摄像头应用。代码中包含了多个头文件,如MyDetect.h、crnn.h、ncnn/net.h,以及Rockchip的AIQ、MPI接口等。这可能涉及到图像处理、神经网络推理和多媒体处理。 用户没有明确提问具体问题,但根据提供的代码和之前的示例,可能需要解释代码的结构和功能,或者解决可能的编译问题、依赖关系等。此外,用户可能对如何在Rockchip平台上部署AI模型、使用NCNN库或处理多媒体流感兴趣。接下来,我需要确定用户的需求。由于用户没有明确的问题,可能需要先总结代码的作用,然后提出相关问题引导用户进一步提问。例如,解释代码中的各个模块,如何集成NCNN进行推理,或者如何处理摄像头数据流。另外,注意代码中可能存在的一些问题,比如头文件的包含顺序、宏定义(如NOMINMAX)、多线程和信号处理相关的部分。可能需要指出这些部分的作用或潜在问题。 最后,根据用户之前的示例,应该在回答中提供代码解释,并给出相关问题。因此,我需要先解释代码的大致结构和功能,然后提出几个相关问题供用户选择,帮助他们深入探讨具体的问题点。</think>这段代码是典型的Rockchip RV1126/RV1109平台AI视觉处理程序的框架代码,主要涉及摄像头图像处理、神经网络推理和多媒体编解码等功能。以下是关键模块的解析: ```cpp // 神经网络推理相关头文件 #include "MyDetect.h" // 自定义检测模块 #include "crnn.h" // CRNN文字识别模型 #include "ncnn/net.h" // 腾讯NCNN推理框架 // Rockchip AIQ接口 #ifdef RV1126_RV1109 #include <rk_aiq_user_api_camgroup.h> #else #include <rk_aiq_user_api2_camgroup.h> #endif // Rockchip多媒体处理接口(MPI) #include "rk_mpi_vi.h" // 视频输入 #include "rk_mpi_vo.h" // 视频输出 #include "rk_mpi_venc.h" // 视频编码 ``` 代码功能解析: 1. **AIQ接口**:负责摄像头图像质量调节(自动白平衡、自动曝光等) 2. **MPI接口**:处理多媒体流水线(视频采集、编码、解码、显示等) 3. **神经网络推理**:通过NCNN框架运行目标检测(MyDetect)和文字识别(CRNN)模型 4. **硬件加速**:使用TDE(硬件加速的图像处理单元)进行图像格式转换 典型视频处理流水线示例: ```cpp // 创建视频输入通道 VI_CHN_ATTR_S vi_attr = { .pcVideoNode = "rkispp_scale0", .u32BufCnt = 3, .enPixFmt = IMAGE_TYPE_NV12, .enWorkMode = VI_WORK_MODE_NORMAL }; RK_MPI_VI_SetChnAttr(0, &vi_attr); RK_MPI_VI_EnableChn(0); // 创建视频编码通道 VENC_CHN_ATTR_S venc_attr = { .stVencAttr = { .enType = RK_VIDEO_ID_H264, .u32PicWidth = 1920, .u32PicHeight = 1080 } }; RK_MPI_VENC_CreateChn(0, &venc_attr); // 绑定视频输入到编码器 MPP_CHN_S src_chn = { .enModId = RK_ID_VI, .s32DevId = 0, .s32ChnId = 0 }; MPP_CHN_S dest_chn = { .enModId = RK_ID_VENC, .s32DevId = 0, .s32ChnId = 0 }; RK_MPI_SYS_Bind(&src_chn, &dest_chn); ```
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值