288 lines
10 KiB
C++
Raw Permalink Normal View History

2025-08-16 15:25:29 +08:00
#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