opencv

时间:2015-11-10 16:19:03

标签: c++ opencv image-processing

Opencv中拜耳模式代码的含义是什么?

例如我有这段代码:

CV_BayerGR2BGR

我的问题是:

  1. 矩阵中第一个像素的颜色是什么(所以像素0,0的颜色是什么)。
  2. 像素(x,y)的颜色是什么?
  3. 有没有简单有效的方法根据特定的拜耳模式找到像素(x,y)的颜色? (因此扩展我编写的代码以用于每个拜耳模式)。
  4. 更新

    正如Miki指出的那样,OpenCv文件说:

    转换常数CV_Bayer C_1 C_2 2BGR和CV_Bayer C_1 C_2 2RGB中的两个字母C_1和C_2表示特定的模式类型。这些是分别来自第二行,第二列和第三列的组件。例如,上述模式具有非常流行的“BG”类型。

    回答了我的第一个问题,但其他两个问题呢?

2 个答案:

答案 0 :(得分:2)

了解模式的类型COLOR_Bayer<type>2BGR,您可以轻松找到每个像素的颜色,检查坐标是奇数还是甚至,因为模式只是一个2x2,在整个图像上重复。

OpenCV模式是:

COLOR_BayerBG2BGR = 46,
COLOR_BayerGB2BGR = 47,
COLOR_BayerRG2BGR = 48,
COLOR_BayerGR2BGR = 49,

COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,
COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,
COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,
COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,    

所以你可以简单地检查前四个。

功能

#define BLUE 0
#define GREEN 1
#define RED 2

int getColorFromBayer(int r, int c, int type)

将输出颜色,给定行r,列c以及模式类型type

以下代码显示了如何恢复每个像素的颜色,并生成拜耳模式的BGR彩色图像。

#include <opencv2\opencv.hpp>
using namespace cv;


//COLOR_BayerBG2BGR = 46,
//COLOR_BayerGB2BGR = 47,
//COLOR_BayerRG2BGR = 48,
//COLOR_BayerGR2BGR = 49,
//
//COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,
//COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,
//COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,
//COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,

#define BLUE 0
#define GREEN 1
#define RED 2

int getColorFromBayer(int r, int c, int type)
{
    static int bg[] = { RED, GREEN, GREEN, BLUE };
    static int gb[] = { GREEN, RED, BLUE, GREEN };
    static int rg[] = { BLUE, GREEN, GREEN, RED };
    static int gr[] = { GREEN, BLUE, RED, GREEN };

    int rr = r % 2;
    int cc = c % 2;

    switch (type)
    {
    case COLOR_BayerBG2BGR: return bg[2 * rr + cc];
    case COLOR_BayerGB2BGR: return gb[2 * rr + cc];
    case COLOR_BayerRG2BGR: return rg[2 * rr + cc];
    case COLOR_BayerGR2BGR: return gr[2 * rr + cc];
    }
    return -1;
}

int main()
{
    Mat3b bayer(10,10, Vec3b(0,0,0));

    // Create bayer pattern BG

    for (int r = 0; r < bayer.rows; ++r)
    {
        for (int c = 0; c < bayer.cols; ++c)
        {
            int color = getColorFromBayer(r,c,COLOR_BayerBG2BGR);

            switch (color)
            {
            case BLUE : bayer(r, c) = Vec3b(255, 0, 0); break;
            case GREEN: bayer(r, c) = Vec3b(0, 255, 0); break;
            case RED  : bayer(r, c) = Vec3b(0, 0, 255); break;
            }
        }
    }

    return 0;
}

答案 1 :(得分:0)

像这样的伪代码?
(请注意CV_BayerBG2RGB = CV_BayerRG2BGR并仅使用一种三元组类型)

if ((x+y) && 1) <> (CV_Bayerxxxxxx && 1)) then
  C(x,y) = G
else 
  if (Pattern is CV_BayerBGxxx || CV_BayerGBxxx) == (y && 1) then
     C(x,y) = B
  else
     C(x,y) = R