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);这个函数进行转换,然后进行存储,存储的地方应该还需要根据对应的格式修改

相关推荐
赛逸展张胜1 分钟前
CES Asia 2025将聚焦AI与自动驾驶,行业先锋共探未来出行变革
人工智能·机器学习·自动驾驶
泰迪智能科技011 分钟前
企业数据挖掘建模平台哪家好?
人工智能·数据挖掘
sauTCc11 分钟前
Pytorch加载数据的Dateset类和DataLoader类
人工智能·pytorch·python
啥都鼓捣的小yao14 分钟前
课程2. 用PyTorch训练神经网络与梯度下降
人工智能·pytorch·神经网络
PeterClerk22 分钟前
DeepSeek R1 训练策略4个阶段解析
人工智能·深度学习·机器学习·语言模型·自然语言处理·llm·deepseek
龚大龙1 小时前
机器学习(李宏毅)——Diffusion Model
人工智能·机器学习
陈敬雷-充电了么-CEO兼CTO1 小时前
DeepSeek-R1:通过强化学习激发大语言模型的推理能力
人工智能·gpt·搜索引擎·自然语言处理·chatgpt·大模型·aigc
小宇爱1 小时前
55、深度学习-自学之路-自己搭建深度学习框架-16、使用LSTM解决RNN梯度消失和梯度爆炸的问题,重写莎士比亚风格文章。
人工智能·rnn·深度学习·神经网络·自然语言处理
南太湖小蚂蚁1 小时前
自然语言处理入门2——神经网络
人工智能·python·深度学习·神经网络·自然语言处理
梦丶晓羽2 小时前
自然语言处理:初识自然语言处理
人工智能·自然语言处理