#include #include #include #include "deal.h" #include #include #include #include #include "Read_Image.h" void handler(int sig) { printf("Get handler sig"); string strcmd = "ps -ef | grep test_JBL_Check| awk '{print $2}' | xargs kill -9 "; const char *cmd = strcmd.c_str(); printf("delete test_JBL_Check success"); if (-1 == system(cmd)) { std::cout << "error" << std::endl; } // delete UnderCarriageCoreLogic::GetInstance(); exit(0); } int _sysmkdir(const std::string &dir) { int ret = mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); if (ret && errno == EEXIST) { printf("dir[%s] already exist.\n", dir.c_str()); } else if (ret) { printf("create dir[%s] error: %d %s\n", dir.c_str(), ret, strerror(errno)); return -1; } else { printf("create dir[%s] success.\n", dir.c_str()); } return 0; } std::string __getParentDir(const std::string &dir) { std::string pdir = dir; if (pdir.length() < 1 || (pdir[0] != '/')) { return ""; } while (pdir.length() > 1 && (pdir[pdir.length() - 1] == '/')) pdir = pdir.substr(0, pdir.length() - 1); pdir = pdir.substr(0, pdir.find_last_of('/')); return pdir; } int _sysmkdirs(const std::string &dir) { int ret = 0; if (dir.empty()) return -1; std::string pdir; if ((ret = _sysmkdir(dir)) == -1) { pdir = __getParentDir(dir); if ((ret = _sysmkdirs(pdir)) == 0) { ret = _sysmkdirs(dir); } } return ret; } int redimg_16() { std::string strImgPath = "/home/aidlux/BOE_CELL_ET/Image/20250718/left/__DB__6LQR560030C6BBA/*.tif"; // std::cout << strImgPath << std::endl; std::vector img_paths; cv::glob(strImgPath, img_paths, true); for (int i = 0; i < img_paths.size(); i++) { std::string filename = img_paths[i]; std::cout << filename << std::endl; size_t pos1 = filename.find('^'); size_t pos2 = filename.rfind(".tif"); // 或 ".tif" 的起始位置 std::string result; if (pos1 != std::string::npos && pos2 != std::string::npos && pos2 > pos1) { result = filename.substr(pos1 + 1, pos2 - pos1 - 1); std::cout << "提取的内容: " << result << std::endl; } else { std::cerr << "格式不匹配,无法提取" << std::endl; } cv::Mat img16 = cv::imread(filename, cv::IMREAD_UNCHANGED); if (img16.empty()) { std::cerr << "无法读取图像: " << filename << std::endl; return -1; } cv::Mat img8; if (img16.type() == CV_16U) { cv::normalize(img16, img8, 0, 255, cv::NORM_MINMAX); img8.convertTo(img8, CV_8U); } else if (img16.type() == CV_8U) { img8 = img16; } else { std::cerr << "图像不是 16 / 8位灰度图,type = " << img16.type() << std::endl; continue; } std::cout << "读取成功: " << img16.cols << " x " << img16.rows << ",类型: CV_16U" << std::endl; // 方式一:线性映射(缩放到0~255) // double minVal, maxVal; // cv::minMaxLoc(img16, &minVal, &maxVal); // std::cout << "图像值范围: [" << minVal << ", " << maxVal << "]" << std::endl; // cv::Mat img8; // img16.convertTo(img8, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal)); // 方式二(如果你知道最大值就是 65535,也可以直接缩放): // img16.convertTo(img8, CV_8U, 1.0 / 256.0); // 65536 -> 256 缩放 // 保存或显示结果 cv::imwrite(result + "o11utput_8bit_gray.png", img8); } getchar(); std::string filename = "/home/aidlux/BOE_CELL_ET/Image/20250718/left/__DB__6LQR560030C6BBA/6LQR560030C6BBA^L127.tif"; // 使用 IMREAD_UNCHANGED 保留原始位深 cv::Mat img16 = cv::imread(filename, cv::IMREAD_UNCHANGED); if (img16.empty()) { std::cerr << "无法读取图像: " << filename << std::endl; return -1; } // 检查是否是 16 位灰度图 if (img16.type() != CV_16U) { std::cerr << "图像不是 16 位灰度图,type = " << img16.type() << std::endl; return -1; } std::cout << "读取成功: " << img16.cols << " x " << img16.rows << ",类型: CV_16U" << std::endl; // 方式一:线性映射(缩放到0~255) double minVal, maxVal; cv::minMaxLoc(img16, &minVal, &maxVal); std::cout << "图像值范围: [" << minVal << ", " << maxVal << "]" << std::endl; cv::Mat img8; img16.convertTo(img8, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal)); // 方式二(如果你知道最大值就是 65535,也可以直接缩放): // img16.convertTo(img8, CV_8U, 1.0 / 256.0); // 65536 -> 256 缩放 // 保存或显示结果 cv::imwrite("output_8bit_gray.png", img8); // cv::imshow("8-bit Gray", img8); // cv::waitKey(0); return 0; } int main(int argc, char *argv[]) { std::cout << "CHECK_WORK: " << CHECK_WORK << std::endl; deal test; for (int i = 0; i < Check_Work_COUNT; i++) { if (CHECK_WORK == Check_Work_Name[i]) { test.m_check_Work_Type = static_cast(i); break; } } if (test.m_check_Work_Type == Check_Work_NULL) { cout << "***********************work type Error *******************************" << endl; return 0; } if (argc > 1 && string(argv[1]) == "-h") { cout << "******************************************************" << endl; cout << "*** 1、./test_JBL_Check: 默认处理一套图 图片文件夹位于 ../data/img/t1,结果位于/home/aidlux/BOE/testresult" << endl; cout << "*** 2、./test_JBL_Check -s: 1 的基础上增加 过程存图,包括edge 和字符检测的中间结果存图,图片位于 当前文件夹。" << endl; cout << "*** 3、./test_JBL_Check -fjc filepath: 处理精测套图大图 结果位于/home/aidlux/BOE/ResultImg" << endl; cout << "*** 4、./test_JBL_Check -feai filepath num: 批量测试边缘检测算法,num 至多处理张数,结果:/home/aidlux/BOE/Edge" << endl; cout << "*** 5、./test_JBL_Check -falign filepath num : 批量测试定位算法,num 至多处理张数,结果:/home/aidlux/BOE/Align" << endl; cout << "*** 6、./test_JBL_Check -rjson filepath: 单张复测,filepath xx/xx/3A3K380001B1DK_20240408_152157_Main_0_2_L255" << endl; cout << "*** 6、./test_JBL_Check -rjsonall filepath: 一套图复测,filepath xx/xx/" << endl; cout << "******************************************************" << endl; return 0; } // redimg_16(); // Read_Image dfe; // dfe.Read_Image_List("../data/img/pre"); // //dfe.Read_Image_List("/home/aidlux/BD_AOI/Data/SmallImage/60HW"); // getchar(); printf("argc = %d\n", argc); for (int i = 0; i < argc; i++) { printf("argv[%d]=%s\n", i, argv[i]); } test.m_nRunType = RUNTYPE_RUN_Pre_BigImg; // 大图 test.m_strCheckFilePath = ""; if (argc > 1 && string(argv[1]) != "-h") { { if (string(argv[1]) == "-f") // 遍历检查武汉精测图片 { test.m_nRunType = RUNTYPE_RUN_File_BigImg; // 大图 if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); } else { cout << "参数错误 ------- " << endl; return 0; } } else if (string(argv[1]) == "-fai") // 遍历检查武汉精测图片 { test.m_nRunType = RUNTYPE_RUN_File_BigImg; // 大图 test.m_nTestAI = 1; if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); } else { cout << "参数错误 ------- " << endl; return 0; } } else if (string(argv[1]) == "-fc2") { test.m_nRunType = RUNTYPE_RUN_Pre_BigImg_Cam2; // if (argc == 3) { if (string(argv[1]) == "-s") { test.m_nSaveDetprocessImg = 1; } } } else if (string(argv[1]) == "-fmark") { test.m_nRunType = RUNTYPE_RUN_File_MarkLine_Test; // if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); test.m_nTestNum == 9999999; } else { cout << "参数错误 ------- " << endl; return 0; } } else if (string(argv[1]) == "-fe") { test.m_nRunType = RUNTYPE_RUN_File_BigImg_WHJC_EDGE_TEST; // if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); test.m_nTestNum == 9999999; } else { cout << "参数错误 ------- " << endl; return 0; } } else if (string(argv[1]) == "-fcell") { test.m_nRunType = RUNTYPE_RUN_File_CEEL_ET; // if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); } else { cout << "参数错误 ------- " << endl; return 0; } } else if (string(argv[1]) == "-feai") { test.m_nRunType = RUNTYPE_RUN_File_BigImg_WHJC_EDGE_AI_TEST; // if (argc == 3) { test.m_strCheckFilePath = string(argv[2]); test.m_nTestNum == 9999999; } else if (argc == 4) { test.m_strCheckFilePath = string(argv[2]); std::string strnum = string(argv[3]); test.m_nTestNum = atoi(strnum.c_str()); } else { cout << "参数错误 ------- " << endl; return 0; } } else { if (string(argv[1]) == "-s") { test.m_nSaveDetprocessImg = 1; } else { cout << "参数错误 ------- " << endl; return 0; } } } } for (int i = 0; i < argc; ++i) { std::cout << "Argument #" << i << ": " << argv[i] << std::endl; } printf("m_nRunType %d m_nSaveDetprocessImg %d path %s\n", test.m_nRunType, test.m_nSaveDetprocessImg, test.m_strCheckFilePath.c_str()); // getchar(); signal(SIGINT, handler); test.start(); while (true) { usleep(10 * 1000); } return 0; }