opencv 存储bgr格式/同理可类推yuv

需求背景

开发rk3588 音视频硬件编解码,然后看见他的输入文件格式。。 只能是裸的文件。不能是压缩过的。就是不能是jpg/png这种格式,只能是以下的图像/视频 的存储格式.那么我没有这个格式的,以前hi3559的bgr格式和他要的也不太一致,然后去搜了以下,发现他要的这个还算是标准格式的

c 复制代码
mpi: color: id 0     0x00000 YUV420SP,      NV12
mpi: color: id 1     0x00001 YUV420SP-10bit
mpi: color: id 2     0x00002 YUV422SP,      NV24
mpi: color: id 3     0x00003 YUV422SP-10bit
mpi: color: id 4     0x00004 YUV420P,       I420
mpi: color: id 5     0x00005 YUV420SP,      NV21
mpi: color: id 6     0x00006 YUV422P,       422P
mpi: color: id 7     0x00007 YUV422SP,      NV42
mpi: color: id 8     0x00008 YUV422-YUYV,   YUY2
mpi: color: id 10    0x0000a YUV422-UYVY,   UYVY
mpi: color: id 12    0x0000c YUV400-Y8,     Y800
mpi: color: id 15    0x0000f YUV444SP
mpi: color: id 16    0x00010 YUV444P
mpi: color: id 65536 0x10000 RGB565
mpi: color: id 65537 0x10001 BGR565
mpi: color: id 65538 0x10002 RGB555
mpi: color: id 65539 0x10003 BGR555
mpi: color: id 65542 0x10006 RGB888
mpi: color: id 65543 0x10007 BGR888
mpi: color: id 65546 0x1000a ARGB8888
mpi: color: id 65547 0x1000b ABGR8888
mpi: color: id 65548 0x1000c BGRA8888
mpi: color: id 65549 0x1000d RGBA8888

先贴一段cmake文件

想要蹭个关注 所以水个cmake

cmake 复制代码
cmake_minimum_required(VERSION 2.8)
project( cvtest )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( demo cv2.cpp )
target_link_libraries( demo ${OpenCV_LIBS} )

主函数就是cv2.cpp,使用的时候需要把这个存储为CMakeLists.txt,和cv2.cpp放在同一个路径下,当然,前提是你的系统有装opencv,我的版本是4.5.5

opencv 主函数

如果图像的格式是BGR888,表示每个像素由蓝色(Blue)、绿色(Green)、红色(Red)各占8位,总共24位。网上看了很多,没有说怎么直接存的,但是他们说Opencv读取进来就是 bgr888,这样的话,想着就直接使用文件读写往里写就可以了。

确实就写进去了。在rk3588的编解码应用中可以正常使用编码。

cpp 复制代码
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core/types.hpp>
#include "opencv4/opencv2/imgproc/imgproc_c.h"

#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
int main(int argc, char** argv ){
    cout<< "this test is for bgr picture store"<<endl;
    Mat image;
    image = imread( "./my.jpg", 1 );
    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    printf("opencv version is %s\r\n",CV_VERSION);
    ofstream outputFile("./sample.bgr", std::ios::out | std::ios::binary);//程序将每个通道的值以二进制形式写入文件,并使用std::ios::binary标志打开文件,以确保以二进制形式写入数据。
     if (!outputFile.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return 1; // 退出程序并返回错误代码
    }
    int rows = image.rows;
    int cols = image.cols;
    cout<<"rows is "<<rows<<" cols is "<<cols<<endl;
        // 将Mat数据写入文件
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
             cv::Vec3b pixel = image.at<cv::Vec3b>(i, j);
            outputFile.write(reinterpret_cast<char*>(&pixel[2]), 1);  // 红色
            outputFile.write(reinterpret_cast<char*>(&pixel[1]), 1);  // 绿色
            outputFile.write(reinterpret_cast<char*>(&pixel[0]), 1);  // 蓝色
            
        }
        // outputFile << "\n";  // 每行结束后换行
    }

    // 关闭文件
    outputFile.close();

    std::cout << "Mat数据已成功写入文件。" << std::endl;
    // Mat image1;
    // cvtColor(image1, image, COLOR_BGR2YUV_I420);
    
}

cv::Vec3b表示一个包含三个uchar(unsigned char)元素的向量,分别表示蓝色、绿色和红色通道的强度。

如果存储yuv等格式,需要使用cvtColor(inputImage, grayImage, COLOR_BGR2YUV);这个函数进行转换,然后进行存储,存储的地方应该还需要根据对应的格式修改

相关推荐
aneasystone本尊11 分钟前
学习 Coze Studio 的知识库入库逻辑
人工智能
然我12 分钟前
从 “只会聊天” 到 “能办实事”:OpenAI Function Call 彻底重构 AI 交互逻辑(附完整接入指南)
前端·javascript·人工智能
岁月宁静19 分钟前
软件开发核心流程全景解析 —— 基于 AI 多模态项目实践
前端·人工智能·后端
wangjiaocheng20 分钟前
软件功能分解输入处理输出递归嵌套模型
人工智能
G等你下课20 分钟前
Function call
前端·人工智能
岁月宁静21 分钟前
MCP 协议应用场景 —— Cursor 连接 Master Go AI
前端·vue.js·人工智能
柠檬味拥抱24 分钟前
融合NLU与NLG的AI Agent语言交互机制研究
人工智能
wydaicls27 分钟前
用函数实现方程函数解题
人工智能·算法·机器学习
努力当一个优秀的程序员34 分钟前
3.逻辑回归:从分类到正则化
人工智能·机器学习
小沈熬夜秃头中୧⍤⃝1 小时前
IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
人工智能