/* * @Author: xiewenji 527774126@qq.com * @Date: 2025-09-13 20:39:37 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-24 14:17:55 * @FilePath: /BOE_FOG_Detect/AlgorithmModule/src/CameraResult.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include "ImageAllResult.h" ImageAllResult::ImageAllResult() { detlog = std::make_shared(); pDetResult = std::make_shared(); } ImageAllResult::~ImageAllResult() { } // ✅ 处理完成后释放中间 cv::Mat 数据,减少内存占用 // 注意:CheckResult(result)中的图像数据必须保留! void ImageAllResult::ReleaseIntermediateData() { std::lock_guard lock_cam(mtx_Det); // ✅ 释放原始输入图像(处理完成后不再需要) if (result && result->in_shareImage) { if (!result->in_shareImage->img.empty()) { result->in_shareImage->img.release(); } if (!result->in_shareImage->AI_maskImg.empty()) { result->in_shareImage->AI_maskImg.release(); } } // ✅ AI_Time 开启时需要保留 detImg(用于生成缺陷小图)和 AI_Qx_MaskList(用于 AI 调试图像) // 其他中间数据可以安全释放 #ifndef AI_Time if (!detImg.empty()) { detImg.release(); } #endif if (!AI_detImg.empty()) { AI_detImg.release(); } if (!AIMaskImg.empty()) { AIMaskImg.release(); } if (!AI_127CellMaskImg.empty()) { AI_127CellMaskImg.release(); } if (!resultImg.empty()) { resultImg.release(); } if (!shieldImg.empty()) { shieldImg.release(); } if (!AI_shieldImg.empty()) { AI_shieldImg.release(); } if (!YX_MaskImg.empty()) { YX_MaskImg.release(); } if (!LcakPol_MaskImg.empty()) { LcakPol_MaskImg.release(); } // 释放 AI 检测中间结果 if (qx_DetAIResult) { qx_DetAIResult->Init(); } if (cell127_DetAIResult) { cell127_DetAIResult->Init(); } // ✅ AI_Time 开启时需要保留 AI_Qx_MaskList(GetAIDetImg 使用) #ifndef AI_Time AI_Qx_MaskList.clear(); #endif } void ImageAllResult::AddLog(std::string str) { LogList.push_back(str); } ImageAllResult::DetStep ImageAllResult::getStep() { std::lock_guard lock_cam(mtx_Det); return m_step; } void ImageAllResult::setStep(DetStep step) { std::lock_guard lock_cam(mtx_Det); m_step = step; } bool ImageAllResult::IsNotDet() { std::lock_guard lock_cam(mtx_Det); if (m_step == DetStep_NotDet) { return true; } return false; } bool ImageAllResult::IsChannel(std::string strChannelName) { std::lock_guard lock_cam(mtx_Det); if (strChannel == strChannelName) { return true; } return false; } int ImageAllResult::AddDetImage(std::shared_ptr p) { { std::lock_guard lock_cam(mtx_Det); result = std::make_shared(); p->time_PushIn = CheckUtil::getcurTime(); result->in_shareImage = p; result->checkStatus = 1; result->nDetStep = 0; result->nresult = -1; result->basicResult.img_id = p->img_id; result->basicResult.imgtype = p->imgtype; result->basicResult.imgstr = p->imgstr; result->basicResult.strChannel = p->strChannel; strChannel = p->strChannel; if (strChannel == "Up-Particle") { cameraBaseResult->UpImg_Status = CameraBaseResult::ImageDet_Status_NoDet; } if (strChannel == "Down-Particle") { cameraBaseResult->DPImg_Status = CameraBaseResult::ImageDet_Status_NoDet; } } // 需要指定 黑白画面 if (strChannel == "BTW" || strChannel == "WTB" || strChannel == "TBW" || strChannel == "HB3" || strChannel == "HB4") { bWhiteOrBlackImg = true; } strBaseInfo = productBaseResult->strproductName + " cam " + cameraBaseResult->strCameraName + " channel " + strChannel; if (p->Det_Mode == DET_MODE_ReJson) { m_CheckResultJson.GetConfig(p->resultJson, pDetResult); fscale_detToresult_x = 1; fscale_detToresult_y = 1; // 图片 if (!p->img.empty()) { detImg = p->img; /* code */ } else { if (pDetResult->CutRoi.width > 0 && pDetResult->CutRoi.height > 0) { detImg = cv::Mat::zeros(pDetResult->CutRoi.height, pDetResult->CutRoi.width, CV_8UC1); } else { detImg = cv::Mat::zeros(1000, 2000, CV_8UC1); } } { cv::Size sz; sz.width = RESIZE_IMAGE_WIDTH; float fw = RESIZE_IMAGE_WIDTH * 1.0f / detImg.cols; sz.height = int(detImg.rows * fw); cv::resize(detImg, resultImg, sz); if (resultImg.channels() == 1) { cv::cvtColor(resultImg, resultImg, cv::COLOR_GRAY2BGR); } result->resultimg = resultImg; result->cutSrcimg = detImg; fscale_detToresult_x = resultImg.cols * 1.0f / detImg.cols; fscale_detToresult_y = resultImg.rows * 1.0f / detImg.rows; } // pDetResult->print("result"); // getchar(); } return 0; }