288 lines
10 KiB
C++
288 lines
10 KiB
C++
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include "vz_ap_bmp.h"
|
|
#include "ImgUtils.h"
|
|
|
|
// extern RGB RGB_Inst[32] ;
|
|
RGB RGB_Inst[] = {
|
|
{0, 162, 232}, //0
|
|
{237, 28, 36}, //1
|
|
{0, 255, 128}, //2
|
|
{255, 174, 201}, //3
|
|
{0, 0, 255}, //4
|
|
{128, 128, 0}, //5
|
|
{255, 242, 0}, //6
|
|
{163, 74, 164}, //7
|
|
{153, 217, 234}, //8
|
|
{200, 191, 231}, //9
|
|
{150, 154, 1}, //10
|
|
{181, 230, 29}, //11
|
|
{0, 128, 255}, //12
|
|
{239, 228, 176}, //13
|
|
{112, 146, 190}, //14
|
|
{43, 113, 83}, //15
|
|
|
|
{232, 162, 0}, //0
|
|
{36, 28, 237}, //1
|
|
{128, 255, 0}, //2
|
|
{201, 174, 255}, //3
|
|
{255, 0, 0}, //4
|
|
{0, 128, 128}, //5
|
|
{0, 242, 255}, //6
|
|
{74, 164, 163}, //7
|
|
{234, 217, 153}, //8
|
|
{231, 191, 200}, //9
|
|
{1, 154, 150}, //10
|
|
{29, 230, 181}, //11
|
|
{255, 128, 0}, //12
|
|
{176, 228, 239}, //13
|
|
{190, 146, 112}, //14
|
|
{83, 113, 43}, //15
|
|
};
|
|
|
|
extern PickLaserResult PickLaserResult_inst;
|
|
extern StdRgnRslt StdRgnRslt_inst;
|
|
|
|
|
|
unsigned short Cvt2StdRgbRslt(
|
|
const unsigned char* SrcPixel,
|
|
const PickLaserResult* PickLaserResult_inst,
|
|
int FrmH,
|
|
int FrmW,
|
|
StdRgnRslt* StdRgnRslt_inst
|
|
)
|
|
{
|
|
unsigned short WinNum = 0;
|
|
|
|
for (unsigned short y = 0; y < FrmH; y++)
|
|
{
|
|
for (int PickId = 0; PickId < PICK_RGN_MAX; PickId++)
|
|
{
|
|
if (PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_PickMsk[y][PickId] == 1)
|
|
{
|
|
StdRgnRslt_inst->WinRdx[WinNum] = PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_WinRdx[y][PickId];
|
|
StdRgnRslt_inst->WinRltvStr[WinNum] = PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] - StdRgnRslt_inst->WinRdx[WinNum];
|
|
StdRgnRslt_inst->WinRltvEnd[WinNum] = PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1 - StdRgnRslt_inst->WinRdx[WinNum];
|
|
StdRgnRslt_inst->WinY[WinNum] = y;
|
|
StdRgnRslt_inst->WinRid[WinNum] = PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_Rid[y][PickId];
|
|
StdRgnRslt_inst->WinRflct[WinNum] = (PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_RflctMsk[y][PickId] & (~PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_LiteRflct[y][PickId]));
|
|
StdRgnRslt_inst->WinOvrlp[WinNum] = PickLaserResult_inst->PickRgn_FrmMaxDeltaStg_OverlapMsk[y][PickId];
|
|
|
|
for (short WinPixCnt = 0; WinPixCnt < SV_WIN_SIZE; WinPixCnt++)//MEANSTG_WIN_SIZE; WinPixCnt++)
|
|
{
|
|
int PixIdx = y * FrmW + StdRgnRslt_inst->WinRdx[WinNum] + WinPixCnt;
|
|
unsigned char PixVlu = 0;//SrcPixel[PixIdx];
|
|
|
|
if (StdRgnRslt_inst->WinRflct[WinNum] == 1)
|
|
{
|
|
if ((WinPixCnt >= (SV_WIN_SIZE / 2 - 1)) && (WinPixCnt <= (SV_WIN_SIZE / 2)))
|
|
{
|
|
PixVlu = 255;
|
|
}
|
|
else
|
|
{
|
|
PixVlu = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PixVlu = SrcPixel[PixIdx];
|
|
}
|
|
|
|
StdRgnRslt_inst->WinPix[WinNum][WinPixCnt] = PixVlu;
|
|
}
|
|
|
|
WinNum++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return WinNum;
|
|
}
|
|
|
|
//#ifdef PICK_RGN
|
|
void SvPickRgnRslt(
|
|
const unsigned char * SrcPixel,
|
|
|
|
int FrmH,
|
|
int FrmW,
|
|
|
|
char * TxtDstFileName,
|
|
char * BmpDstFileName
|
|
)
|
|
{
|
|
char *TXTData = (char *)malloc(256);
|
|
memset(TXTData,0,256);
|
|
|
|
std::ofstream TXTFile(TxtDstFileName);
|
|
|
|
int LazerWinNum = 0;
|
|
|
|
snprintf(TXTData, sizeof(TXTData), "%3x", (0x800 | SV_WIN_SIZE));//MEANSTG_WIN_SIZE);
|
|
|
|
TXTFile << TXTData << std::endl;
|
|
|
|
for(unsigned short y=0; y<FrmH; y++)
|
|
{
|
|
int WinNumPerLine = 0;
|
|
for(int PickId = 0; PickId < PICK_RGN_MAX; PickId++)
|
|
{
|
|
if(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_PickMsk[y][PickId] == 0)
|
|
{
|
|
if(PICK_RGN_MAX == 1)
|
|
{
|
|
snprintf(TXTData, sizeof(TXTData), "000 000");
|
|
TXTFile << TXTData << std::endl;
|
|
|
|
for(short WinPixCnt = 0; WinPixCnt < SV_WIN_SIZE; WinPixCnt++)//MEANSTG_WIN_SIZE; WinPixCnt++)
|
|
{
|
|
snprintf(TXTData, sizeof(TXTData), "00");
|
|
TXTFile << TXTData << std::endl;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
unsigned short WinRdx = PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_WinRdx[y][PickId] + ALIGN_RDX;//PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y] - ((MEANSTG_WIN_SIZE/2) - (PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y]/2));
|
|
unsigned short WinRltvLazerRdxStr = PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] - WinRdx;
|
|
unsigned short WinRltvLazerRdxEnd = PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1 - WinRdx;
|
|
|
|
unsigned char JointWinRltvRdx = (unsigned char)(((WinRltvLazerRdxEnd & 0xf) << 4) | (WinRltvLazerRdxStr & 0xf));
|
|
#if 0
|
|
snprintf(TXTData, sizeof(TXTData), "%04x %04x %04x %01x", WinRdx, y, PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId], (PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_OverlapMsk[y][PickId] | (PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_RflctMsk[y][PickId] & (~PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LiteRflct[y][PickId]))) );
|
|
#else
|
|
unsigned short RealRflctMsk = (PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_RflctMsk[y][PickId] & (~PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LiteRflct[y][PickId]));
|
|
unsigned short Flag = ((RealRflctMsk << 1) | PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_OverlapMsk[y][PickId]);
|
|
// snprintf(TXTData, sizeof(TXTData), "%04x %04x %04x %01x", WinRdx, y, PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId], Flag);
|
|
snprintf(TXTData, sizeof(TXTData), "%04x %04x %04x %01x %02x", WinRdx, y, PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId], Flag, JointWinRltvRdx);
|
|
|
|
//if(RealRflctMsk)
|
|
//{
|
|
// int DbgHit = 0;
|
|
//}
|
|
#endif
|
|
TXTFile << TXTData << std::endl;
|
|
|
|
for(short WinPixCnt = 0; WinPixCnt < SV_WIN_SIZE; WinPixCnt++)//MEANSTG_WIN_SIZE; WinPixCnt++)
|
|
{
|
|
int PixIdx = y * FrmW + WinRdx + WinPixCnt;
|
|
unsigned char PixVlu = 0;//SrcPixel[PixIdx];
|
|
|
|
if(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_RflctMsk[y][PickId] == 1 && PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LiteRflct[y][PickId] == 0)
|
|
{
|
|
if((WinPixCnt >= (SV_WIN_SIZE/2-1)) && (WinPixCnt <= (SV_WIN_SIZE/2)))
|
|
{
|
|
PixVlu = 255;
|
|
}
|
|
else
|
|
{
|
|
PixVlu = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PixVlu = SrcPixel[PixIdx];
|
|
}
|
|
snprintf(TXTData, sizeof(TXTData), "%02x", PixVlu);
|
|
TXTFile << TXTData << std::endl;
|
|
}
|
|
|
|
WinNumPerLine++;
|
|
}
|
|
}
|
|
|
|
if(LazerWinNum > (MAX_WIN_NUM-WinNumPerLine))
|
|
{
|
|
// while(1)
|
|
// {
|
|
std::cout << "#===WinNumExceed::" << MAX_WIN_NUM << "===#"<< std::endl;
|
|
// }
|
|
|
|
break;
|
|
}
|
|
|
|
LazerWinNum += WinNumPerLine;
|
|
}
|
|
|
|
TXTFile.close();
|
|
free(TXTData);
|
|
|
|
unsigned char *DstR = (unsigned char *)malloc(FrmH*FrmW);
|
|
unsigned char *DstG = (unsigned char *)malloc(FrmH*FrmW);
|
|
unsigned char *DstB = (unsigned char *)malloc(FrmH*FrmW);
|
|
for(int y = 0; y < FrmH; y++)
|
|
{
|
|
for(int x = 0; x < FrmW; x++)
|
|
{
|
|
DstR[y * FrmW + x] = SrcPixel[y * FrmW + x];
|
|
DstG[y * FrmW + x] = SrcPixel[y * FrmW + x];
|
|
DstB[y * FrmW + x] = SrcPixel[y * FrmW + x];
|
|
}
|
|
}
|
|
|
|
for(unsigned short y=0; y<FrmH; y++)
|
|
{
|
|
for(int PickId = 0; PickId < PICK_RGN_MAX; PickId ++)
|
|
{
|
|
if(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_PickMsk[y][PickId] == 1)
|
|
{
|
|
if(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_OverlapMsk[y][PickId] == 1)
|
|
{
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 255;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 0;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 0;
|
|
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 0;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 255;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 0;
|
|
}
|
|
else
|
|
{
|
|
if(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_RflctMsk[y][PickId] == 1 && PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LiteRflct[y][PickId] == 0)
|
|
{
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 255;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 255;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = 0;
|
|
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 0;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 0;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = 255;
|
|
}
|
|
else
|
|
{
|
|
{
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].R;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].G;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId]] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].B;
|
|
|
|
DstR[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].R;
|
|
DstG[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].G;
|
|
DstB[y * FrmW + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerRdx[y][PickId] + PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_LazerW[y][PickId] - 1] = RGB_Inst[(PickLaserResult_inst.PickRgn_FrmMaxDeltaStg_Rid[y][PickId] % 32)].B;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BMP_Write(
|
|
BmpDstFileName,
|
|
|
|
FrmH,
|
|
FrmW,
|
|
|
|
DstR,
|
|
DstG,
|
|
DstB
|
|
);
|
|
|
|
free(DstR);
|
|
free(DstG);
|
|
free(DstB);
|
|
}
|
|
|
|
//#endif //#ifdef PICK_RGN
|
|
|