学习目标:将bayerpartten raw 通过demosic转成rgb 三通道的图像
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <math.h>
#include < fstream>//读raw文件时需要用到,否则会报未引用完整类型
#include < iostream>
int bayerparten_to_rgb()
{
int width = 1920;
int height = 1080;
// 打开.raw文件
std::ifstream file("E:/test/colorcheck/colorcheck_d65.raw", std::ios::binary);
// 检查文件是否成功打开
if (!file)
{
std::cerr << "Cannot open file!" << std::endl;
return 1;
}
// 创建一个vector来存储像素值
std::vector<uint32_t> pixels(width * height);
// 读取像素值
//file.read(reinterpret_cast<char*>(pixels.data()), pixels.size());
file.read(reinterpret_cast<char*>(pixels.data()), pixels.size() * sizeof(uint16_t));
// 检查是否读取成功
if (!file)
{
std::cerr << "Cannot read file!" << std::endl;
return 1;
}
// 将像素值转换为Mat
cv::Mat bayerImage(height, width, CV_16UC1, pixels.data());
if (pixels.size() < height * width)
{
std::cerr << "Not enough pixel data!" << std::endl;
return 1;
}
//std::cout << static_cast<int>(pixels[8294400]) << std::endl;
// 创建一个空的RGB图像
cv::Mat rgbImage_rg , rgbImage_bg, rgbImage_gr, rgbImage_gb;
// 将Bayer pattern图像转换为RGB图像
cv::cvtColor(bayerImage, rgbImage_rg, cv::COLOR_BayerRG2BGR);//cvtcolor只能用u8或者u16
cv::cvtColor(bayerImage, rgbImage_bg, cv::COLOR_BayerBG2BGR);
cv::cvtColor(bayerImage, rgbImage_gr, cv::COLOR_BayerGR2BGR);
cv::cvtColor(bayerImage, rgbImage_gb, cv::COLOR_BayerGB2BGR);
std::cout << "Width: " << rgbImage_gb.cols << std::endl;
std::cout << "Height: " << rgbImage_gb.rows << std::endl;
std::cout << "Type: " << rgbImage_gb.type() << std::endl;
std::cout << "Depth: " << rgbImage_gb.depth() << std::endl; // CV_32F的深度值是5
std::cout << "Channels: " << rgbImage_gb.channels() << std::endl; // 3通道图像的通道数是3
std::vector<cv::Mat> channels(3);
// 将BGR图像分割为三个单通道图像
cv::split(rgbImage_rg, channels);
// channels[0]是蓝色通道,channels[1]是绿色通道,channels[2]是红色通道
cv::Mat blueChannel = channels[0];
cv::Mat greenChannel = channels[1];
cv::Mat redChannel = channels[2];
// 保存RGB图像
cv::imwrite("E:/test/result/blueChannel.jpg", blueChannel);
cv::imwrite("E:/test/result/greenChannel.jpg", greenChannel);
cv::imwrite("E:/test/result/redChannel.jpg", redChannel);
cv::imwrite("E:/test/result/rgbImage_gr.jpg", rgbImage_gr);
cv::imwrite("E:/test/result/rgbImage_gb.jpg", rgbImage_gb);
return 0;
}
学习内容:
- 搭建 opencv环境
- 如何获取raw piexl值
- 创建一个vector来存储像素值
- 需要了解cvtColor函数
学习时间:
2023.10.21-10.24
学习的总结:
1.#include //读raw文件时需要用到,否则会报未引用完整类型
// 打开.raw文件
std::ifstream file(“E:/test/colorcheck/colorcheck_d65.raw”, std::ios::binary);需要用到#include
2.需要用下面函数储存像素值
// 创建一个vector来存储像素值
std::vector<uint32_t> pixels(width * height);
- 由于这个函数cv::cvtColor(bayerImage, rgbImage_rg, cv::COLOR_BayerRG2BGR);//cvtcolor只能用u8或者u16
所以调用这个函数让它变成u16的mat类 file.read(reinterpret_cast<char*>(pixels.data()), pixels.size() * sizeof(uint16_t));要不然可能会出现只出现一半图像的问题 -
std::cout << "Depth: " << rgbImage_gb.depth() << std::endl; // CV_32F的深度值是5
用这个函数来判断深度,从而知道 cv::Mat bayerImage(height, width, CV_16UC1, pixels.data());中是用vec3b(深度为0,u8)还是vec3w(深度为2,u16)