📄 colorconversion.h
字号:
//-----------------------------------------------------------------------------
// Company: Basler Vision Technologies
// Section: Vision Components
// Project: 1394 Driver
// Subproject: Color conversion
// <b> Visual SourceSafe Information:</b>
// $Archive: /Software/inc/ColorConversion.h $
// $Author: Happe, A.$
// $Revision: 8$
// $Date: 05.06.2003 15:42:53$
//-----------------------------------------------------------------------------
/**
\file ColorConversion.h
*
* Utility class CColorConversion ( YUV -> RGB and Bayer8 -> RGB conversion)
*
*/
//-----------------------------------------------------------------------------
/*
YUV <-> RGB
range : 0 to 255 for Y, R, G, B
-128 to 127 for U and V
R = Y + 1.4022 V
G = Y - 0.3457 U - 0.7144 V
B = Y + 1.7710 U
Y = 0.2989 R + 0.5866 G + 0.1145 B
U = - 0.1688 R - 0.3312 G + 0.5 B
V = 0.5 R - 0.5184 G - 0.0817 B
*/
#pragma once
class CColorConversion
{
public:
/// Convert YUV422 to RGB
static void ConvertYUV422ToRGB(PBYTE pDest, const PBYTE pSource, const CSize& Size);
enum PatternOrigin_t
{
poGB = 1,
poGR,
poB,
poR
};
/// Convert Bayer raw data to RGB
static void ConvertMono8ToRGB(PBYTE pDest, const PBYTE pSource, const CSize& Size, PatternOrigin_t PatternOrigin,
const BYTE pLutR[256], const BYTE pLutG[256], const BYTE pLutB[256]);
private:
static void ProcessGBLines(RGBTRIPLE* pDest, const PBYTE pSource, const CSize& Size, unsigned int lineoffset,
const BYTE pLutR[256], BYTE const pLutG[256], const BYTE pLutB[256]);
static void ProcessRGLines(RGBTRIPLE* pDest, const PBYTE pSource, const CSize& Size, unsigned int lineoffset,
const BYTE pLutR[256], const BYTE pLutG[256], const BYTE pLutB[256]);
static void ProcessBGLines(RGBTRIPLE* pDest, const PBYTE pSource, const CSize& Size, unsigned int lineoffset,
const BYTE pLutR[256], const BYTE pLutG[256], const BYTE pLutB[256]);
static void ProcessGRLines(RGBTRIPLE* pDest, const PBYTE pSource, const CSize& Size, unsigned int lineoffset,
const BYTE pLutR[256], const BYTE pLutG[256], const BYTE pLutB[256]);
};
//------------------------------------------------------------------------------
// void CColorConversion::ConvertYUV422ToRGB(PBYTE pDest, const PBYTE pSource, const CSize& Size)
// Author:
//------------------------------------------------------------------------------
/**
* Conversion of YUV422 pixel data into RGB
*
* \param pDest Pointer to a buffer the RGB data will be written to
* \param pSource Pointer to the pixel data to be converted
* \param Size Size of image
* \return void
*
*/
//------------------------------------------------------------------------------
void CColorConversion::ConvertYUV422ToRGB(PBYTE pDest, const PBYTE pSource, const CSize& Size)
{
static const int LUT_G_U[256] = // ( U - 128 ) * 0.3457 + 0.5
{-44, -44, -44, -43, -43, -43, -42, -42,
-41, -41, -41, -40, -40, -40, -39, -39,
-39, -38, -38, -38, -37, -37, -37, -36,
-36, -36, -35, -35, -35, -34, -34, -34,
-33, -33, -32, -32, -32, -31, -31, -31,
-30, -30, -30, -29, -29, -29, -28, -28,
-28, -27, -27, -27, -26, -26, -26, -25,
-25, -25, -24, -24, -24, -23, -23, -22,
-22, -22, -21, -21, -21, -20, -20, -20,
-19, -19, -19, -18, -18, -18, -17, -17,
-17, -16, -16, -16, -15, -15, -15, -14,
-14, -13, -13, -13, -12, -12, -12, -11,
-11, -11, -10, -10, -10, -9, -9, -9,
-8, -8, -8, -7, -7, -7, -6, -6,
-6, -5, -5, -4, -4, -4, -3, -3,
-3, -2, -2, -2, -1, -1, -1, 0,
0, 0, 1, 1, 1, 2, 2, 2,
3, 3, 3, 4, 4, 4, 5, 5,
6, 6, 6, 7, 7, 7, 8, 8,
8, 9, 9, 9, 10, 10, 10, 11,
11, 11, 12, 12, 12, 13, 13, 13,
14, 14, 15, 15, 15, 16, 16, 16,
17, 17, 17, 18, 18, 18, 19, 19,
19, 20, 20, 20, 21, 21, 21, 22,
22, 22, 23, 23, 24, 24, 24, 25,
25, 25, 26, 26, 26, 27, 27, 27,
28, 28, 28, 29, 29, 29, 30, 30,
30, 31, 31, 31, 32, 32, 32, 33,
33, 34, 34, 34, 35, 35, 35, 36,
36, 36, 37, 37, 37, 38, 38, 38,
39, 39, 39, 40, 40, 40, 41, 41,
41, 42, 42, 43, 43, 43, 44, 44};
static const int LUT_G_V[256] = // ( V - 128 ) * 0.7144 + 0.5
{-91, -91, -90, -89, -89, -88, -87, -86,
-86, -85, -84, -84, -83, -82, -81, -81,
-80, -79, -79, -78, -77, -76, -76, -75,
-74, -74, -73, -72, -71, -71, -70, -69,
-69, -68, -67, -66, -66, -65, -64, -64,
-63, -62, -61, -61, -60, -59, -59, -58,
-57, -56, -56, -55, -54, -54, -53, -52,
-51, -51, -50, -49, -49, -48, -47, -46,
-46, -45, -44, -44, -43, -42, -41, -41,
-40, -39, -39, -38, -37, -36, -36, -35,
-34, -34, -33, -32, -31, -31, -30, -29,
-29, -28, -27, -26, -26, -25, -24, -24,
-23, -22, -21, -21, -20, -19, -19, -18,
-17, -16, -16, -15, -14, -14, -13, -12,
-11, -11, -10, -9, -9, -8, -7, -6,
-6, -5, -4, -4, -3, -2, -1, -1,
0, 1, 1, 2, 3, 4, 4, 5,
6, 6, 7, 8, 9, 9, 10, 11,
11, 12, 13, 14, 14, 15, 16, 16,
17, 18, 19, 19, 20, 21, 21, 22,
23, 24, 24, 25, 26, 26, 27, 28,
29, 29, 30, 31, 31, 32, 33, 34,
34, 35, 36, 36, 37, 38, 39, 39,
40, 41, 41, 42, 43, 44, 44, 45,
46, 46, 47, 48, 49, 49, 50, 51,
51, 52, 53, 54, 54, 55, 56, 56,
57, 58, 59, 59, 60, 61, 61, 62,
63, 64, 64, 65, 66, 66, 67, 68,
69, 69, 70, 71, 71, 72, 73, 74,
74, 75, 76, 76, 77, 78, 79, 79,
80, 81, 81, 82, 83, 84, 84, 85,
86, 86, 87, 88, 89, 89, 90, 91};
static const int LUT_B_U[256] = // ( U - 128 ) * 1.7710 + 0.5
{-227, -225, -223, -221, -220, -218, -216, -214,
-213, -211, -209, -207, -205, -204, -202, -200,
-198, -197, -195, -193, -191, -189, -188, -186,
-184, -182, -181, -179, -177, -175, -174, -172,
-170, -168, -166, -165, -163, -161, -159, -158,
-156, -154, -152, -151, -149, -147, -145, -143,
-142, -140, -138, -136, -135, -133, -131, -129,
-128, -126, -124, -122, -120, -119, -117, -115,
-113, -112, -110, -108, -106, -104, -103, -101,
-99, -97, -96, -94, -92, -90, -89, -87,
-85, -83, -81, -80, -78, -76, -74, -73,
-71, -69, -67, -66, -64, -62, -60, -58,
-57, -55, -53, -51, -50, -48, -46, -44,
-43, -41, -39, -37, -35, -34, -32, -30,
-28, -27, -25, -23, -21, -19, -18, -16,
-14, -12, -11, -9, -7, -5, -4, -2,
0, 2, 4, 5, 7, 9, 11, 12,
14, 16, 18, 19, 21, 23, 25, 27,
28, 30, 32, 34, 35, 37, 39, 41,
43, 44, 46, 48, 50, 51, 53, 55,
57, 58, 60, 62, 64, 66, 67, 69,
71, 73, 74, 76, 78, 80, 81, 83,
85, 87, 89, 90, 92, 94, 96, 97,
99, 101, 103, 104, 106, 108, 110, 112,
113, 115, 117, 119, 120, 122, 124, 126,
128, 129, 131, 133, 135, 136, 138, 140,
142, 143, 145, 147, 149, 151, 152, 154,
156, 158, 159, 161, 163, 165, 166, 168,
170, 172, 174, 175, 177, 179, 181, 182,
184, 186, 188, 189, 191, 193, 195, 197,
198, 200, 202, 204, 205, 207, 209, 211,
213, 214, 216, 218, 220, 221, 223, 225};
static const int LUT_R_V[256] = // ( V - 128 ) * 1.4022 + 0.5
{-179, -178, -177, -175, -174, -172, -171, -170,
-168, -167, -165, -164, -163, -161, -160, -158,
-157, -156, -154, -153, -151, -150, -149, -147,
-146, -144, -143, -142, -140, -139, -137, -136,
-135, -133, -132, -130, -129, -128, -126, -125,
-123, -122, -121, -119, -118, -116, -115, -114,
-112, -111, -109, -108, -107, -105, -104, -102,
-101, -100, -98, -97, -95, -94, -93, -91,
-90, -88, -87, -86, -84, -83, -81, -80,
-79, -77, -76, -74, -73, -72, -70, -69,
-67, -66, -65, -63, -62, -60, -59, -57,
-56, -55, -53, -52, -50, -49, -48, -46,
-45, -43, -42, -41, -39, -38, -36, -35,
-34, -32, -31, -29, -28, -27, -25, -24,
-22, -21, -20, -18, -17, -15, -14, -13,
-11, -10, -8, -7, -6, -4, -3, -1,
0, 1, 3, 4, 6, 7, 8, 10,
11, 13, 14, 15, 17, 18, 20, 21,
22, 24, 25, 27, 28, 29, 31, 32,
34, 35, 36, 38, 39, 41, 42, 43,
45, 46, 48, 49, 50, 52, 53, 55,
56, 57, 59, 60, 62, 63, 65, 66,
67, 69, 70, 72, 73, 74, 76, 77,
79, 80, 81, 83, 84, 86, 87, 88,
90, 91, 93, 94, 95, 97, 98, 100,
101, 102, 104, 105, 107, 108, 109, 111,
112, 114, 115, 116, 118, 119, 121, 122,
123, 125, 126, 128, 129, 130, 132, 133,
135, 136, 137, 139, 140, 142, 143, 144,
146, 147, 149, 150, 151, 153, 154, 156,
157, 158, 160, 161, 163, 164, 165, 167,
168, 170, 171, 172, 174, 175, 177, 178};
int Y, U, V;
int R, G, B;
int deltaG, deltaB, deltaR;
int i, j, i2, m, n;
unsigned char* pData;
unsigned char* pRaw;
for (i=0; i<Size.cy; i++)
{
i2 = Size.cy - i - 1;
m = 3*i*Size.cx;
n = 2*i2*Size.cx;
pData = pDest + m;
pRaw = (unsigned char*) pSource + n;
for (j=0; j<Size.cx; j++)
{
U = *pRaw++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -