Opencv中拜耳模式代码的含义是什么?
例如我有这段代码:
CV_BayerGR2BGR
我的问题是:
正如Miki指出的那样,OpenCv文件说:
转换常数CV_Bayer C_1 C_2 2BGR和CV_Bayer C_1 C_2 2RGB中的两个字母C_1和C_2表示特定的模式类型。这些是分别来自第二行,第二列和第三列的组件。例如,上述模式具有非常流行的“BG”类型。
回答了我的第一个问题,但其他两个问题呢?
答案 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