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;
}
相关推荐
滨HI05 小时前
opencv 计算面积、周长
人工智能·opencv·计算机视觉
诗句藏于尽头1 天前
MediaPipe+OpenCV的python实现交互式贪吃蛇小游戏
人工智能·python·opencv
std78792 天前
MATLAB 实用案例三:图像边缘检测、数据拟合与可视化、信号处理
图像处理·opencv·计算机视觉
zhangrelay2 天前
如何使用AI快速编程实现标注ROS2中sensor_msgs/msg/Image图像色彩webots2025a
人工智能·笔记·opencv·学习·计算机视觉·机器人视觉
萧鼎2 天前
深入掌握 OpenCV-Python:从图像处理到智能视觉
图像处理·python·opencv
TechNomad2 天前
十八、OpenCV中的滤波与卷积
opencv
柳鲲鹏2 天前
OpenCV:BGR/RGB转I420(颜色失真),再转NV12
人工智能·opencv·计算机视觉
有为少年3 天前
告别乱码:OpenCV 中文路径(Unicode)读写的解决方案
人工智能·opencv·计算机视觉
初学小刘3 天前
基于 U-Net 的医学图像分割
python·opencv·计算机视觉
长沙红胖子Qt3 天前
案例分享:音视频录像综合应用(支持录制麦克风音频、录制摄像头视频、同步录制音视频,支持opencv对图形进行处理,录制mp4文件)
opencv·音视频·录音·音视频同步·录像·录像图像处理