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 天前
本地视频打码:多模型检测、帧间追踪与18种模糊的选型
opencv·目标检测·ai·自然语言处理·音视频·视频
爱吃火鸡面呀2 天前
OpenCV 颜色识别实战:从 HSV 原理到摄像头实时检测
人工智能·opencv·计算机视觉
ahccqw3 天前
OpenCV 缩放 与 位移
人工智能·opencv·计算机视觉
AI的探索之旅3 天前
OpenCV Day40 —— K-means 聚类与 EM 高斯混合
opencv·kmeans·聚类
AI的探索之旅3 天前
OpenCV Day39 —— 无缝克隆 seamless cloning(cloning_demo / cloning_gui)
人工智能·opencv
小豆庄3 天前
会议录屏忘打码后的技术复盘:本地自动化隐私脱敏方案
运维·opencv·目标检测·自动化·视频·纹理贴图
小豆庄3 天前
监控视频脱敏:夜视/低光线条件下人脸检测的工程处理思路
opencv·计算机视觉·阿里云·视觉检测·音视频·视频
小豆庄4 天前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
zwc32104320554 天前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
誰能久伴不乏4 天前
OpenCV 入门(二):像素访问、ROI 与深浅拷贝
人工智能·opencv·计算机视觉