#include #include #include //#include "ap_utils.h" #include #include "peakCentering.h" #include "../../globals/tbGlobals.h" void save_bmp_2( const char* filename, std::vector& testSamples) { FILE* file; #if defined(__linux__) file = fopen(filename, "wb"); #else fopen_s(&file, filename, "wb"); #endif if (!file) { printf("闂傚倷娴囧▔鏇㈠窗閹炬剚鐒藉Δ锝呭暙缁�鍕煏閸繃顥滄い蹇撶埣濮婅櫣鎹勯妸銉︾�鹃梺鍝勵儏椤兘鐛箛娑欏�婚柤鎭掑劜濞呫垺绻涢幘鏉戞惛闁稿孩濞婃俊瀵革拷锝庡枛缁狀垶鏌ㄩ悤鍌涘 %s\n", filename); return; } // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺岋繝宕掑Ο鐚存嫹閺嶎偓鎷峰杈ㄥ殌鐞氭瑩鐓崶銊р檨闁哄懏鎮傞弻锟犲磼濡尨鎷烽弽顐嫹濮橆剛绉洪柡灞诲姂閹垽宕ㄦ繝鍕磿闂備礁缍婇ˉ鎾诲礂濮楋拷瀵偊骞樼拠鍙夘棟闂侀潧鐗嗗Λ妤咁敂閸撲胶纾奸柣鎰靛墯閸婃劙鏌℃担瑙勫磳鐎殿噮鍓熸俊鍫曞幢濡ゅ﹣绱﹂梻鍌欐祰濞夋洟宕抽敃鍌氱闁跨噦鎷� int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 婵犳鍣徊鐣屾崲濮楋拷瀵偊骞樼拠鍙夘棟闂侀潧鐗嗗Λ妤咁敂閸洘鈷戦悹鎭掑妼閺嬫垿鏌$�n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧闂備礁鎼崐鍫曞磹閺嶎偓鎷峰鐐3闂傚倷娴囧▔鏇㈠窗閺団偓锟戒礁顭ㄩ崼鐔锋疅闂佺鐭夋俊鍥╃矓閸洘鐓欏瀣瘎娑撶兒闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌ㄩ悤鍌涘 int padding = (4 - (bytes_per_row % 4)) % 4; int row_size = bytes_per_row + padding; int height = testSamples.size(); // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳锟界懓瀚伴崑濠傤焽濡ゅ懏鈷戦悹鎭掑妼閺嬫垿鏌$�n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧濠电偞鎸婚崫搴ㄥ磿閹惰棄违閻庯綆鍠栫粻顖滐拷鐟板閸╁洦绂掗敓锟� BMPFileHeader file_header = { .file_type = 0x4D42, // 'BM' .file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height, .reserved1 = 0, .reserved2 = 0, .offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) }; // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳锟界懓瀚伴崑濠傤焽濡ゅ懏鈷戦悹鎭掑妼閺嬫垿鏌$�n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧闂備礁鎼崐鍫曞磹閺嶎偓鎷峰顒傜Ш妤犵偘绶氶、娑橆潩閵夈倗鐭� BMPInfoHeader info_header = { .size = sizeof(BMPInfoHeader), .width = RGN_DATA_WIN_SIZE, .height = height, // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺岋繝宕掑Ο鐚存嫹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣告贡閸忔﹢藟閹捐桅婵鍩栭悡銉╂煟閺傛寧鍟為柣蹇e櫍閺岀喐顦版惔鈥冲箣闂佽桨鐒﹂幑鍥ь嚕椤掑嫬围闁糕剝顨忔导鎾绘⒒娴h姤纭堕柛鐘冲姍瀵憡绻濆顒傤唵闂佺粯鍨兼慨銈夊疾閹间焦鐓欓柛锔诲幗閻掑潡鏌熷ú璁抽偗妤犵偛绻橀幃婊堟嚍閵夛附顏熼梻鍌欒兌閸嬫挻绔熼崱娑栵拷鍌烆敋閿熶粙鐛箛娑欏�婚柤鎭掑劜濞呫垽姊洪崫鍕拷鍫曞磹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣哥秺椤ユ捇宕楀锟藉顐﹀箻鐠囧弶顥濋梺闈涚墕濡顢旈敓锟� .planes = 1, .bit_count = 24, .compression = 0, .size_image = (uint32_t)(row_size * height), .x_pixels_per_meter = 0, .y_pixels_per_meter = 0, .colors_used = 0, .colors_important = 0 }; // 闂備礁鎲¢崝鏍偡閳哄懎鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ繗娉涢…鍧楁嚋閸偄鍞夐梺杞扮劍閹瑰洤顕i鍕ч柛鈩冾殢娴兼捇姊虹拠鈥冲伎闁瑰嚖鎷� fwrite(&file_header, 1, sizeof(BMPFileHeader), file); fwrite(&info_header, 1, sizeof(BMPInfoHeader), file); // 闂備礁鎲¢崝鏍偡閳哄懎鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ繐鐖煎铏规崉閵娿儲鐎鹃梺鍝勵儏椤兘鐛箛娑欏�婚柤鎭掑劜濞呫垽姊洪崫鍕拷鍫曞磹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣哥秺椤ユ捇宕楀锟藉顐﹀箻鐠囪尙顔夐梺鍛婂灟閸婃绮旈崼鏇熺厵濡炲楠搁崢鎾煛娴h宕岀�殿噮鍓熸俊鍫曞幢濡ゅ﹣绱﹂梻鍌欐祰濞夋洟宕伴幇鏉垮嚑濠电姵鑹剧粻顖炴煟閹达絽袚闁哄懏鎮傞弻鐔访虹拠鎻掔缂備線纭搁崳锝夌嵁韫囨稒鍊婚柤鎭掑劜閺嗐垽姊绘担鑺ョ《闁哥姵鎸鹃崚鎺楀传閵夛箑鍘归梻浣哥仢椤戝懘顢旈崼鏇熲拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚� uint8_t padding_bytes[3] = { 0, 0, 0 }; for (int y = height - 1; y >= 0; y--) { for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) { uint8_t pixel = (uint8_t)testSamples[y].data[x]; // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳绱掔�n剚娴嘊闂佸搫顦遍崕鎰板礂濞戞碍瀚婚柣鎴炲嚡R濠碉紕鍋戦崐鏍ь渻娴犲鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ骏鎷� fputc(pixel, file); // B fputc(pixel, file); // G fputc(pixel, file); // R } fwrite(padding_bytes, 1, padding, file); // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺屻劑鎮ら崒娑橆伓 } fclose(file); } std::vector readTestFile( const char* file, int* winSize) { std::ifstream inputFile(file); int winW = 0; std::string strLineTxt; getline(inputFile, strLineTxt); sscanf(strLineTxt.c_str(), "%x", &winW); int size = 0; std::vector testData; Luma_rgnData a_line; while(getline(inputFile, strLineTxt)) { if (strLineTxt.empty()) continue; if(size == 0) { int winRdx, y, Rid, Flag, PeakRltvRdx; sscanf(strLineTxt.c_str(), "%04x %04x %04x %01x %02x", &winRdx, &y, &Rid, &Flag, &PeakRltvRdx); a_line.WinRdx = (uint16_t)winRdx; a_line.y = (uint16_t)y; a_line.Rid = (uint16_t)Rid; a_line.Flag = (uint8_t)Flag; a_line.PeakRltvRdx = (uint8_t)PeakRltvRdx; for(int n = 0; n < RGN_DATA_WIN_SIZE; n ++) a_line.data[n] = 0; size = 1 ; } else //receive Data { int data; sscanf(strLineTxt.c_str(), "%02x", &data); a_line.data[size -1] = (uint8_t)data; if(size >= 16) { testData.push_back(a_line); size = 0; } else size ++; } } inputFile.close(); return testData; } void genTestSream( std::vector& srcData, hls::stream& inStream, int LRflag, //0-left image; 1-right image const Luma_frameInfo frameInfo) { RgnPix VSync = {0,0,0,0,0,0,0}; ap_uint<32> data_32; //1st:FrmNo data_32 = frameInfo.FrmNo; VSync.Sync = 0b10; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH); VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2); VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0; inStream.write(VSync); //2nd:FrmNo data_32 = frameInfo.TimeStamp; VSync.Sync = 0b00; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH); VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2); VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0; inStream.write(VSync); //3rd:encInfo data_32 = frameInfo.encInfo; VSync.Sync = 0b00; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH); VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2); VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0; inStream.write(VSync); //4th:frmW(12bit), frmH(12bit) ap_uint<16> data16_1, data16_2; data16_1 = frameInfo.W; data16_2 = frameInfo.H; VSync.Sync = 0b00; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data16_2.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinRid(10,0) = 0; inStream.write(VSync); //5th: frmX, WinNum int winNum = (int)srcData.size(); if(LRflag == 0) data16_1 = frameInfo.left_L; else data16_1 = frameInfo.right_L; data16_2 = (uint16_t)winNum; VSync.Sync = 0b00; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data16_2.range(CAM4K_Y_WIDTH-1,0); inStream.write(VSync); //6th: frmY if(LRflag == 0) data16_1 = frameInfo.left_T; else data16_1 = frameInfo.right_T; VSync.Sync = 0b00; VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0); VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = 0; inStream.write(VSync); //output data for(int i = 0; i < winNum; i ++) { Luma_rgnData* a_line = &srcData[i]; RgnPix Hsync; Hsync.LazerWinX = (ap_uint)a_line->WinRdx; Hsync.LazerWinY = (ap_uint)a_line->y; Hsync.LazerWinRid = (ap_uint<11>)a_line->Rid; Hsync.LazerWinFlag = (ap_uint<4>)a_line->Flag; Hsync.LazerWinRsv = 0; Hsync.RltvRdx = (ap_uint<8>)a_line->PeakRltvRdx; Hsync.Sync = 0b01; inStream.write(Hsync); for(int j = 0; j < RGN_DATA_WIN_SIZE/2; j ++) { RgnPix a_data = {0,0,0,0,0,0,0}; ap_uint<8> data8_1, data8_2; data8_1 = (ap_uint<8>)a_line->data[j * 2]; data8_2 = (ap_uint<8>)a_line->data[j * 2 + 1]; a_data.LazerWinX(7,0) = data8_1.range(7,0); a_data.LazerWinX(CAM4K_Y_WIDTH-1, 8) = 0; a_data.LazerWinY(7,0) = data8_2.range(7,0); a_data.LazerWinY(CAM4K_Y_WIDTH-1, 8) = 0; a_data.Sync = 0b00; inStream.write(a_data); } } //add Last sync data VSync.LazerWinFlag = 0; VSync.LazerWinRid = 0; VSync.LazerWinRsv = 0; VSync.LazerWinX = 0; VSync.LazerWinY = 0; VSync.RltvRdx = 0; VSync.Sync = 0b11; inStream.write(VSync); return; } void convertStreamToArray( hls::stream& streamData, std::vector& arrayData, uint32_t* FrmNo, uint32_t* timeStamp, uint32_t* encInfo, uint16_t* frameROI_w, uint16_t* frameROI_h, uint16_t* frameROI_x, uint16_t* frameROI_y) { //1st:FrmNo RgnPix VSync = streamData.read(); ap_uint<32> data_32; data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0); data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0); *FrmNo = (int)data_32; //2nd:timeStamp VSync = streamData.read(); data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0); data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0); *timeStamp = (int)data_32; //3rd:encInfo VSync = streamData.read(); data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0); data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0); *encInfo = (int)data_32; //4th:frmW(12bit), frmH(12bit) VSync = streamData.read(); ap_uint<16> data16_1, data16_2; data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data16_1(15, CAM4K_Y_WIDTH) = 0; data16_2(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0); data16_2(15, CAM4K_Y_WIDTH) = 0; *frameROI_w = data16_1; *frameROI_h = data16_2; //5th: frmX, WinNum VSync = streamData.read(); data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data16_1(15, CAM4K_Y_WIDTH) = 0; data16_2(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0); data16_2(15, CAM4K_Y_WIDTH) = 0; *frameROI_x = data16_1; uint16_t winNum = (uint16_t)data16_2; //6th: frmY VSync = streamData.read(); data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0); data16_1(15, CAM4K_Y_WIDTH) = 0; *frameROI_y = data16_1; //output data for(int i = 0; i <= winNum; i ++) { RgnPix Hsync = streamData.read(); if(Hsync.Sync == 0b11) break; else if(Hsync.Sync != 0b01) continue; Luma_rgnData a_line; a_line.WinRdx = (uint16_t)Hsync.LazerWinX; a_line.y = (uint16_t)Hsync.LazerWinY; if(a_line.y >= 1963) int kkk = 1; //debug point a_line.Rid = (uint16_t)Hsync.LazerWinRid; a_line.Flag = (uint8_t)Hsync.LazerWinFlag; a_line.PeakRltvRdx = (uint8_t)Hsync.RltvRdx; for(int j = 0; j < RGN_DATA_WIN_SIZE/2; j ++) { RgnPix a_data = streamData.read(); ap_uint<8> data8_1, data8_2; data8_1(7,0) = a_data.LazerWinX.range(7,0); data8_2(7,0) = a_data.LazerWinY.range(7,0); a_line.data[j * 2] = (uint8_t)data8_1; a_line.data[j * 2 + 1] = (uint8_t)data8_2; } arrayData.push_back(a_line); } return; } void writepeakCenteringData( const char* fileName, std::vector& outData) { std::ofstream sw(fileName); char str[250]; #if defined(__linux__) sprintf(str, "0x10"); #else sprintf_s(str, "0x10"); #endif sw << str << std::endl; int i_max = outData.size(); for (int i = 0; i < i_max; i++) { char data[250]; #if defined(__linux__) sprintf(data, "%04x %04x %04x %01x %02x", outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].PeakRltvRdx); #else sprintf_s(data, "%04x %04x %04x %01x %02x", outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].PeakRltvRdx); #endif sw << data << std::endl; for (int j = 0; j < RGN_DATA_WIN_SIZE; j++) { #if defined(__linux__) sprintf(data, "%02x", outData[i].data[j]); #else sprintf_s(data, "%02x", outData[i].data[j]); #endif sw << data << std::endl; } } sw.close(); } int main() { setvbuf(stdout, NULL, _IONBF, 0); // _IONBF = 无缓冲,立即输出 TbModule currModule = TB_1_peakCentering; for(int n = 0; n < tb_group_count; n ++) { int winSize = 0; int fileStart = tb_groups[n].start_id; int fileEnd = tb_groups[n].end_id; for(int fi = fileStart; fi <= fileEnd; fi++) { TbPaths test_path_L; int rcode_L = tb_get_paths(currModule, n,fi, 0, &test_path_L); TbPaths test_path_R; int rcode_R = tb_get_paths(currModule, n,fi, 1, &test_path_R); Luma_frameInfo framwInfo = readParaFile(test_path_L.paras, fi); std::vector testData_L = readTestFile(test_path_L.input, &winSize); std::vector testData_R = readTestFile(test_path_R.input, &winSize); //gen test stream hls::stream inStream_L; genTestSream(testData_L, inStream_L, 0, framwInfo); hls::stream inStream_R; genTestSream(testData_R, inStream_R, 1, framwInfo); //peakCentering hls::stream outStream_L; peakCentering(inStream_L,outStream_L); hls::stream outStream_R; peakCentering(inStream_R,outStream_R); //output std::vector outData_L; uint32_t outFrmNo_L, outTimeStamp_L, outEncInfo_L; uint16_t outROI_w_L,outROI_h_L, outROI_x_L,outROI_y_L; convertStreamToArray( outStream_L, outData_L, &outFrmNo_L, &outTimeStamp_L, &outEncInfo_L, &outROI_w_L, &outROI_h_L, &outROI_x_L, &outROI_y_L); writepeakCenteringData(test_path_L.output, outData_L); //right std::vector outData_R; uint32_t outFrmNo_R, outTimeStamp_R, outEncInfo_R; uint16_t outROI_w_R,outROI_h_R, outROI_x_R,outROI_y_R; convertStreamToArray( outStream_R, outData_R, &outFrmNo_R, &outTimeStamp_R, &outEncInfo_R, &outROI_w_R, &outROI_h_R, &outROI_x_R, &outROI_y_R); writepeakCenteringData(test_path_R.output, outData_R); printf("%s ... done\n", test_path_L.input); } } printf("done!\n"); }