From f9261d2fbbb2e2ac389a14285c8bcb8427a5de59 Mon Sep 17 00:00:00 2001 From: zjc-zjc-123 <1714105370@qq.com> Date: Thu, 28 Nov 2024 00:19:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E4=BD=86=E6=98=AF=E5=A4=9A=E6=AC=A1?= =?UTF-8?q?=E9=A2=84=E6=B5=8B=E7=9A=84bug=E6=97=A0=E6=B3=95=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Matrox/utils.cpp | 27 +++++--- tests/test_total.cpp | 143 ++++++++++++++++++++++++++----------------- 2 files changed, 105 insertions(+), 65 deletions(-) diff --git a/src/Matrox/utils.cpp b/src/Matrox/utils.cpp index 9acf3ab..5e2b730 100644 --- a/src/Matrox/utils.cpp +++ b/src/Matrox/utils.cpp @@ -227,16 +227,19 @@ Mat mil2mat(const MIL_ID mil_img) { } + #include +#include #include -#include +#include +#include void displayCombinedResults(const std::vector& images, const std::string& windowName) { - // Get the screen resolution (you can adjust this if needed, this is for a typical screen) - int screen_width = round(GetSystemMetrics(SM_CXSCREEN) * 0.4); - int screen_height = round(GetSystemMetrics(SM_CYSCREEN) * 0.4); + // Get the screen resolution + int screen_width = GetSystemMetrics(SM_CXSCREEN); // Screen width + int screen_height = GetSystemMetrics(SM_CYSCREEN); // Screen height - // First, we need to find the maximum width and height among the input images + // Find the maximum width and height among the input images int max_width = 0; int max_height = 0; @@ -248,12 +251,16 @@ void displayCombinedResults(const std::vector& images, const std::strin } } - // Resize all images to a reasonable scale to fit the screen - float scale_factor = min((float)screen_width / max_width, (float)screen_height / max_height); + // Calculate the scaling factor based on the maximum image width and screen width + float scale_factor = 1.0f; // Default scale factor is 1 (no scaling) - // If the images are already too large, reduce the scale factor - if (scale_factor > 1.0) scale_factor = 1.0; + // If images are larger than the screen width, scale them down + if (max_width > screen_width) { + scale_factor = (float)screen_width / max_width; + } + + // Resize all images based on the calculated scale factor std::vector resized_images; for (const auto& img : images) { if (!img.empty()) { @@ -296,7 +303,7 @@ void displayCombinedResults(const std::vector& images, const std::strin // Set the window properties to allow resizing cv::namedWindow(windowName, cv::WINDOW_NORMAL); - cv::resizeWindow(windowName, screen_width, screen_height); // Resize window to screen size + cv::resizeWindow(windowName, final_result.cols, final_result.rows); // Resize window based on the final image size // Display the combined result cv::imshow(windowName, final_result); diff --git a/tests/test_total.cpp b/tests/test_total.cpp index 9591744..6328574 100644 --- a/tests/test_total.cpp +++ b/tests/test_total.cpp @@ -10,11 +10,12 @@ #include "Matrox/utils.h" #include "Matrox/color_range.h" #include "Matrox/template_matching.h" +#include // For directory traversal // 宏定义 #define SAVE_PATH3 MIL_TEXT("C:\\Users\\zjc\\Desktop\\suspect.png") #define SAVE_PATH4 MIL_TEXT("C:\\Users\\zjc\\Desktop\\suspect2.png") -#define IMAGE_PATH MIL_TEXT(".\\test_imgs\\dimo.bmp") +#define IMAGE_DIR MIL_TEXT(".\\test_imgs\\cotton_image_new") // 文件夹路径 #define run_high_sat true; #define run_templating true; @@ -23,20 +24,46 @@ MIL_ID MilApplication, MilSystem, MilDisplay; std::map params; +namespace fs = std::filesystem; // 使用命名空间 fs 来方便调用 + using namespace std; + +cv::Mat overlayResultOnInput(const cv::Mat& cv_input, const cv::Mat& total_result, double alpha = 0.5, int colormap = cv::COLORMAP_JET) { + // 1. 将 total_result 转换为伪彩色图像 + cv::Mat total_result_color; + cv::applyColorMap(total_result, total_result_color, colormap); // 使用 JET 色图 + + // 2. 确保 cv_input 是三通道图像(如果是灰度图像,则转换为 BGR) + cv::Mat cv_input_rgb; + if (cv_input.channels() == 1) { + cv::cvtColor(cv_input, cv_input_rgb, cv::COLOR_GRAY2BGR); + } else { + cv_input_rgb = cv_input.clone(); // 保证不修改原始图像 + } + + // 3. 设置叠加透明度(alpha: 0.0-1.0) + double beta = 1.0 - alpha; + + // 4. 使用加权和将 total_result_color 叠加到 cv_input_rgb 上 + cv::Mat overlay; + cv::addWeighted(cv_input_rgb, alpha, total_result_color, beta, 0.0, overlay); + + // 5. 返回叠加后的图像 + return overlay; +} + int main() { // 初始化 MIL 应用 - MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, &MilDisplay, M_NULL, M_NULL) ; - // 读取图片 - MIL_ID MilImage=M_NULL, MilHighSatResult = M_NULL, MilTemplateMatchingResult = M_NULL; - MbufRestore(IMAGE_PATH, MilSystem, &MilImage); + MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, &MilDisplay, M_NULL, M_NULL); + Timer timer1, timer2; std::map params; read_params_from_file("..\\config\\color_range_config.txt", params); read_params_from_file("..\\config\\template_color_config.txt", params); + #if run_templating - TemplateMatcher matcher(MilSystem, MilDisplay, params); - matcher.LoadConfig("..\\config\\template_config.txt"); + TemplateMatcher matcher(MilSystem, MilDisplay, params); + matcher.LoadConfig("..\\config\\template_config.txt"); #endif #if run_deep_learning @@ -47,75 +74,81 @@ int main() { timer1.printElapsedTime("Load config and templates and models"); cout << "Sequence running start:" << endl; - for(int i = 0; i < 10; i++) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - cout << i << endl; - timer1.restart(); - timer2.restart(); - cv::Mat deep_result, high_sat_result, template_result, total_result; - // 艳丽色彩检测 + // 遍历文件夹中的所有图片文件 + for (const auto& entry : fs::directory_iterator(IMAGE_DIR)) { + if (entry.is_regular_file()) { + string image_path = entry.path().string(); + cout << "Processing image: " << image_path << endl; + + // 读取当前图片 + MIL_ID MilImage = M_NULL, MilHighSatResult = M_NULL, MilTemplateMatchingResult = M_NULL; + MbufRestore(convert_to_wstring(image_path), MilSystem, &MilImage); + + timer1.restart(); + timer2.restart(); + cv::Mat deep_result, high_sat_result, template_result, total_result; + + // 艳丽色彩检测 #if run_high_sat - high_sat_detect(MilImage, MilHighSatResult, params); - MIL_ID MilHighSatUint8 = convert_to_uint8(MilHighSatResult); - MdispSelect(MilDisplay, MilHighSatUint8); - high_sat_result = mil2mat(MilHighSatResult); - timer1.printElapsedTime("High Sat finished"); + high_sat_detect(MilImage, MilHighSatResult, params); + MIL_ID MilHighSatUint8 = convert_to_uint8(MilHighSatResult); + // MdispSelect(MilDisplay, MilHighSatUint8); + high_sat_result = mil2mat(MilHighSatResult); + timer1.printElapsedTime("High Sat finished"); #else - high_sat_result = cv::Mat::zeros(1024,4096, CV_8UC1); + high_sat_result = cv::Mat::zeros(1024, 4096, CV_8UC1); #endif #if run_templating - // 模板匹配检测 - matcher.predict(MilImage, MilTemplateMatchingResult, params); - template_result = mil2mat(MilTemplateMatchingResult); - timer1.printElapsedTime("Template Matching finished"); + // 模板匹配检测 + matcher.predict(MilImage, MilTemplateMatchingResult, params); + template_result = mil2mat(MilTemplateMatchingResult); + timer1.printElapsedTime("Template Matching finished"); #else - template_result= cv::Mat::zeros(1024,4096, CV_8UC1); + template_result = cv::Mat::zeros(1024, 4096, CV_8UC1); #endif + #if run_deep_learning - // 深度学习检测 - cv::Mat cv_input = mil2mat(MilImage); - std::vector result = runner.predict(cv_input); - deep_result = runner.postProcess(result, cv_input); - // 640x640 的全零矩阵 + // 深度学习检测 + cv::Mat cv_input = mil2mat(MilImage); + std::vector result = runner.predict(cv_input); + deep_result = runner.postProcess(result, cv_input); #else - deep_result = cv::Mat::zeros(1024,4096, CV_8UC1); + deep_result = cv::Mat::zeros(1024, 4096, CV_8UC1); #endif + timer1.printElapsedTime("Deep Learning finished"); + if (!deep_result.empty() && !high_sat_result.empty() && !template_result.empty()) { + cv::bitwise_or(deep_result, high_sat_result, total_result); + cv::bitwise_or(total_result, template_result, total_result); + } else { + cerr << "Error: One or more detection results are empty!" << endl; + } - timer1.printElapsedTime("Deep Learning finished"); + timer2.printElapsedTime("Prediction finished Total"); + // 保存结果 + cv::imwrite("./runs/deep_result_" + entry.path().filename().string() + ".png", deep_result); + cv::imwrite("./runs/high_sat_result_" + entry.path().filename().string() + ".png", high_sat_result); + cv::imwrite("./runs/template_result_" + entry.path().filename().string() + ".png", template_result); + cv::imwrite("./runs/total_result_" + entry.path().filename().string() + ".png", total_result); - if (!deep_result.empty() && !high_sat_result.empty() && !template_result.empty()) { - cv::bitwise_or(deep_result, high_sat_result, total_result); - cv::bitwise_or(total_result, template_result, total_result); - } else { - cerr << "Error: One or more detection results are empty!" << endl; + std::vector images = { deep_result, high_sat_result, template_result, total_result }; + displayCombinedResults(images, "Combined Results"); + images = { cv_input, overlayResultOnInput(cv_input, total_result, 0.1, cv::COLORMAP_OCEAN)}; + displayCombinedResults(images, "Combined Results"); + // 释放当前图片资源 + MbufFree(MilImage); + MbufFree(MilHighSatResult); + MbufFree(MilTemplateMatchingResult); } - timer2.printElapsedTime("Prediction finished Total"); - - - cv::imwrite("./runs/deep_result"+std::to_string(i)+".png", deep_result); - cv::imwrite("./runs/high_sat_result"+std::to_string(i)+".png", high_sat_result); - cv::imwrite("./runs/template_result"+std::to_string(i)+".png", template_result); - cv::imwrite("./runs/total_result"+std::to_string(i)+".png", total_result); - std::vector images = {deep_result, high_sat_result, template_result, total_result}; - displayCombinedResults(images, "Combined Results"); - } - // 释放资源 - MbufFree(MilImage); - MbufFree(MilHighSatResult); - MbufFree(MilTemplateMatchingResult); + #if run_templating matcher.~TemplateMatcher(); #endif MappFreeDefault(MilApplication, MilSystem, MilDisplay, M_NULL, M_NULL); - - std::cout << "所有模块检测已完成!按 退出。" << std::endl; - getchar(); - return 0; }