isp处理的流程(1)-将bayerpartten raw 通过demosic转成rgb 三通道的图像

学习目标:将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;

}

学习内容:

  1. 搭建 opencv环境
  2. 如何获取raw piexl值
  3. 创建一个vector来存储像素值
  4. 需要了解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);

  1. 由于这个函数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));要不然可能会出现只出现一半图像的问题
  2.  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)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值