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;
}
相关推荐
深度研习笔记5 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
深度研习笔记19 小时前
OpenCV工业视觉进阶14|SQLite违规数据库存储+历史记录查询+Excel报表导出,完成项目商用数据闭环(验收必备)
数据库·opencv·sqlite
C++ 老炮儿的技术栈1 天前
OpenCV 实现社保卡透视矫正:Hough 直线提取四角并转正证件图像
c语言·c++·人工智能·opencv·算法·计算机视觉·c
深度研习笔记1 天前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
深度研习笔记2 天前
OpenCV工业视觉实战06|ROI区域截取+局部精细化检测,锁定作业区域、屏蔽无效背景,大幅提升YOLO检测准确率
人工智能·opencv·yolo
fai厅的秃头姐!2 天前
OpenCV-基础篇
人工智能·opencv·计算机视觉
丨白色风车丨2 天前
OpenCV 基于 HSV 颜色空间实时颜色分割(摄像头蓝色识别)
人工智能·opencv·计算机视觉·hsv颜色识别·python计算机视觉
深度研习笔记2 天前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
在世修行2 天前
高斯模糊与图像去噪
opencv·gaussianblur
xgc_java3 天前
在Java里把ONNX/OpenCV/FFmpeg跑稳:28篇bytedeco实战小册完整指南
java·opencv·ffmpeg