1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
//-----------------------------------------------------------------------------------------------
// Main.cpp
//-----------------------------------------------------------------------------------------------
#include <windows.h>
#include <math.h>
//#define GRAY_SCALE_BEFORE
#define INPUT_FRAME_WIDTH 640
#define INPUT_FRAME_HEIGHT 480
#define BMP_SIZE_HEADER 54
#define INPUT_FRAME_WIDTH_RGB24 (INPUT_FRAME_WIDTH * 3)
#define TOTAL_FRAME_SIZE (INPUT_FRAME_WIDTH_RGB24 * INPUT_FRAME_HEIGHT)
#define INPUT_FILE_STRING L"C:\\projet\\media\\rgb24\\imageBmp.bmp"
#define OUTPUT_FILE_STRING L"C:\\projet\\media\\rgb24\\Census.bmp"
void CreateBmpFile(BYTE**, const UINT);
// I = (R + G + B) / 3
// Gray scale intensity = 0.333R + 0.333G + 0.333B
// Gray scale intensity = 0.30R + 0.59G + 0.11B
// gray = (0.299*r + 0.587*g + 0.114*b);
// INT gray = ceil(0.3*R + 0.59*G + 0.11*B);
void main(){
HANDLE hFileInPut = INVALID_HANDLE_VALUE;
DWORD dwRead;
DWORD dwFileSize;
BYTE* pDataIn = NULL;
BYTE* pTmp;
BYTE** pDataInCensus = NULL;
BYTE** pDataOutCensus = NULL;
hFileInPut = CreateFile(INPUT_FILE_STRING, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
dwFileSize = GetFileSize(hFileInPut, NULL);
pDataIn = new BYTE[dwFileSize];
ReadFile(hFileInPut, (LPVOID)pDataIn, dwFileSize, &dwRead, 0);
pDataInCensus = new BYTE*[INPUT_FRAME_HEIGHT];
pDataOutCensus = new BYTE*[INPUT_FRAME_HEIGHT];
for(int i = 0; i < INPUT_FRAME_HEIGHT; i++){
pDataInCensus[i] = new BYTE[INPUT_FRAME_WIDTH_RGB24];
pDataOutCensus[i] = new BYTE[INPUT_FRAME_WIDTH_RGB24];
}
pTmp = pDataIn + BMP_SIZE_HEADER;
for(int i = 0; i < INPUT_FRAME_HEIGHT; i++){
memcpy(pDataInCensus[i], pTmp, INPUT_FRAME_WIDTH_RGB24);
pTmp += INPUT_FRAME_WIDTH_RGB24;
}
#ifdef GRAY_SCALE_BEFORE
int iGrayScale;
BYTE r;
BYTE g;
BYTE b;
// GrayScale
for(int i = 0; i < INPUT_FRAME_HEIGHT; i++){
pTmp = pDataInCensus[i];
for(int j = 0; j < INPUT_FRAME_WIDTH_RGB24; j += 3){
r = pTmp[0];
g = pTmp[1];
b = pTmp[2];
//iGrayScale = static_cast<int>(floor((0.3f * r + 0.59f * g + 0.11f * b) + 0.5f));
iGrayScale = static_cast<int>((r + g + b) / 3.0f);
pTmp[0] = static_cast<BYTE>(iGrayScale);
pTmp[1] = static_cast<BYTE>(iGrayScale);
pTmp[2] = static_cast<BYTE>(iGrayScale);
pTmp += 3;
}
}
#endif
unsigned int census = 0;
unsigned int bit = 0;
int m = 3;
int n = 3;//window size
int i,j,x,y;
int shiftCount = 0;
for(x = m / 2; x < INPUT_FRAME_HEIGHT - m / 2; x++){
for(y = n / 2; y < INPUT_FRAME_WIDTH_RGB24 - n / 2; y++){
census = 0;
shiftCount = 0;
for(i = x - m / 2; i <= x + m / 2; i++){
for(j = y - n / 2; j <= y + n / 2; j++){
//skip the center pixel
if(shiftCount != m * n / 2){
census <<= 1;
//compare pixel values in the neighborhood
if(pDataInCensus[i][j] < pDataInCensus[x][y])
bit = 1;
else
bit = 0;
census = census + bit;
}
shiftCount++;
}
}
pDataOutCensus[x][y] = census;
}
}
CreateBmpFile(pDataOutCensus, TOTAL_FRAME_SIZE);
for(int i = 0; i < INPUT_FRAME_HEIGHT; i++){
delete[] pDataInCensus[i];
delete[] pDataOutCensus[i];
}
delete[] pDataInCensus;
delete[] pDataOutCensus;
delete[] pDataIn;
}
void CreateBmpFile(BYTE** ppData, const UINT uiFrameSize){
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwWritten;
BYTE header24[54] = {0x42, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00,
0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
DWORD dwSizeFile = TOTAL_FRAME_SIZE;
dwSizeFile += 54;
header24[2] = dwSizeFile & 0x000000ff;// 0x36
header24[3] = static_cast<BYTE>((dwSizeFile & 0x0000ff00) >> 8);// 0x10
header24[4] = static_cast<BYTE>((dwSizeFile & 0x00ff0000) >> 16);// 0x0e
header24[5] = (dwSizeFile & 0xff000000) >> 24;// 0x00
dwSizeFile -= 54;
header24[18] = INPUT_FRAME_WIDTH & 0x000000ff;// 0x80
header24[19] = (INPUT_FRAME_WIDTH & 0x0000ff00) >> 8;// 0x02
header24[20] = static_cast<BYTE>((INPUT_FRAME_WIDTH & 0x00ff0000) >> 16);// 0x00
header24[21] = (INPUT_FRAME_WIDTH & 0xff000000) >> 24;// 0x00
header24[22] = INPUT_FRAME_HEIGHT & 0x000000ff;// 0x0e
header24[23] = (INPUT_FRAME_HEIGHT & 0x0000ff00) >> 8;// 0x01
header24[24] = static_cast<BYTE>((INPUT_FRAME_HEIGHT & 0x00ff0000) >> 16);// 0x00
header24[25] = (INPUT_FRAME_HEIGHT & 0xff000000) >> 24;// 0x00
// 000E1036
header24[34] = dwSizeFile & 0x000000ff;// 0x00
header24[35] = (dwSizeFile & 0x0000ff00) >> 8;// 0x10
header24[36] = static_cast<BYTE>((dwSizeFile & 0x00ff0000) >> 16);// 0x0e
header24[37] = static_cast<BYTE>((dwSizeFile & 0xff000000) >> 24);// 0x00
hFile = CreateFile(OUTPUT_FILE_STRING, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(hFile, (LPCVOID)header24, 54, &dwWritten, 0);
for(int i = 0; i < INPUT_FRAME_HEIGHT; i++){
WriteFile(hFile, (LPCVOID)ppData[i], INPUT_FRAME_WIDTH_RGB24, &dwWritten, 0);
}
CloseHandle(hFile);
} |