OpenCV实现BGR2BayerGB/BG格式的转换

1、说明

OpenCV没有提供从BGR生成Bayer格式的接口,需要自己写

OpenCV定义为4种格式,分别为:

BGGR排列 -> RG格式

RGGB排列 -> BG格式

GRBG排列 -> GB格式

GBRG排列 -> GR格式

2、转换

复制代码
void CUtils::BGR2BayerGB(const cv::Mat &matSrc, cv::Mat &matDst) //BGR格式转换为BayerGB格式
{
    //GRBG排列 -> GB格式
    matDst = cv::Mat(matSrc.size(), CV_8UC1, cv::Scalar::all(0));

    for (int y = 0; y < matSrc.rows; ++y)
    {
        for (int x = 0; x < matSrc.cols; ++x)
        {
            cv::Vec3b colorSrc = matSrc.at<cv::Vec3b>(y, x);
            uchar colorDst = 0;

            if (y % 2 == 0)
            {
                colorDst = (x % 2 == 0) ? colorSrc[1] : colorSrc[2]; //G:R
            }
            else
            {
                colorDst = (x % 2 == 0) ? colorSrc[0] : colorSrc[1]; //B:G
            }

            matDst.at<uchar>(y, x) = colorDst;
        }
    }
}

void CUtils::BGR2BayerBG(const cv::Mat &matSrc, cv::Mat &matDst) //BGR格式转换为BayerBG格式
{
    //RGGB排列 -> BG格式
    matDst = cv::Mat(matSrc.size(), CV_8UC1, cv::Scalar::all(0));

    for (int y = 0; y < matSrc.rows; ++y)
    {
        for (int x = 0; x < matSrc.cols; ++x)
        {
            cv::Vec3b colorSrc = matSrc.at<cv::Vec3b>(y, x);
            uchar colorDst = 0;

            if (y % 2 == 0)
            {
                colorDst = (x % 2 == 0) ? colorSrc[2] : colorSrc[1]; //R:G
            }
            else
            {
                colorDst = (x % 2 == 0) ? colorSrc[1] : colorSrc[0]; //G:B
            }

            matDst.at<uchar>(y, x) = colorDst;
        }
    }
}

3、测试

复制代码
void Widget::on_pushButton_BGR2BayerBG_clicked()
{
    QFileDialog *fileDlg = new QFileDialog(this);
    fileDlg->setWindowTitle(tr("打开图片"));

    QStringList qstrFilters;
    qstrFilters << "picture(*.bmp;*.jpg;*.png)";
    fileDlg->setNameFilters(qstrFilters);            //设置文件过滤器
    fileDlg->setFileMode(QFileDialog::ExistingFile); //设置选择单文件,如果是多个文件就写成ExistingFiles
    fileDlg->setAcceptMode(QFileDialog::AcceptOpen);

    if (fileDlg->exec() == QDialog::Accepted)
    {
        QStringList strPathList = fileDlg->selectedFiles();
        if (strPathList.count() > 0)
        {
            //文件路径
            QString file_path = strPathList.at(0);

            //打开图片
            cv::Mat m1;
            m1 = UTILS->readMat(file_path, cv::IMREAD_COLOR);

            //转换
            cv::Mat m2;
            UTILS->BGR2BayerBG(m1, m2);
            UTILS->writeMat("d:\\test_BGR2BayerBG.bmp", m2);

            //验证
            cv::Mat m3;
            cv::cvtColor(m2, m3, cv::COLOR_BayerBG2BGR);
            UTILS->writeMat("d:\\test_BayerBG2BGR.bmp", m3);
        }
    }

    fileDlg->close();
    delete fileDlg;
    fileDlg = nullptr;
}
相关推荐
别动我齐刘海2 小时前
从0到1独立搭建机器人软件系统
c++·人工智能·神经网络·opencv·目标检测·机器学习·机器人
AI的探索之旅3 小时前
97 个 OpenCV 实例(十五):几何校正,透视变换 + ECC 对齐
人工智能·opencv·计算机视觉
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<二十七>:图像分割概述
c++·人工智能·opencv·计算机视觉
yyk333242 天前
OpenCV中运动目标检测
opencv·目标检测·目标跟踪
AndrewHZ2 天前
图像处理入门021 | 直方图:图像像素分布的可视化 —— cv2.calcHist 与 4 类典型分布
图像处理·opencv·直方图·直方图均衡化·cdf·灰度直方图·多通道直方图
爱吃火鸡面呀2 天前
OpenCV 实战:文档扫描与神经风格迁移完整指南
人工智能·opencv·计算机视觉
陈年老古董2 天前
OpenCV实战:文档扫描与图像风格迁移
人工智能·python·opencv·计算机视觉
AI的探索之旅2 天前
97 个 OpenCV 实例(十四):图像分割,GrabCut 抠图 + inpaint 去水印
人工智能·opencv·计算机视觉
词却2 天前
OpenCV入门(五):图像拼接、背景建模、光流估计与DNN风格迁移
opencv
派大_星2 天前
OpenCV中的文档扫描与DNN图像处理
人工智能·opencv·计算机视觉