fix 传统检测区域位置偏移

dev_lsy
liusiyang 4 weeks ago
parent 3377bfd34f
commit a86bd821b6

@ -291,6 +291,7 @@ private:
Rect m_old_productROI = Rect(0, 0, 0, 0); Rect m_old_productROI = Rect(0, 0, 0, 0);
std::vector<cv::Point> m_old_cur_edgeDet_region; std::vector<cv::Point> m_old_cur_edgeDet_region;
std::vector<cv::Point> m_old_cur_markLine_region; std::vector<cv::Point> m_old_cur_markLine_region;
std::vector<cv::Point> m_old_cur_traditional_region;
cv::Point m_old_cur_markLine_mark1; cv::Point m_old_cur_markLine_mark1;
cv::Point m_old_cur_markLine_mark2; cv::Point m_old_cur_markLine_mark2;
std::vector<RegionConfigST> m_old_cur_regionConfigArr; std::vector<RegionConfigST> m_old_cur_regionConfigArr;

@ -528,6 +528,7 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){
m_old_cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1; m_old_cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1;
m_old_cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2; m_old_cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2;
m_old_cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr; m_old_cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr;
m_old_cur_traditional_region = m_pbaseCheckFunction->traditionDet.detArea;
} }
Rect old_roi = m_old_productROI; Rect old_roi = m_old_productROI;
Point old_center(old_roi.x + old_roi.width / 2, old_roi.y + old_roi.height / 2); Point old_center(old_roi.x + old_roi.width / 2, old_roi.y + old_roi.height / 2);
@ -553,6 +554,8 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){
cv::Point& cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1; cv::Point& cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1;
cv::Point& cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2; cv::Point& cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2;
std::vector<RegionConfigST>& cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr; std::vector<RegionConfigST>& cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr;
cv::Rect& cur_traditional_rect = m_pbaseCheckFunction->traditionDet.detArea_ROI;
std::vector<cv::Point>& cur_traditional_region = m_pbaseCheckFunction->traditionDet.detArea;
/*进行修改*/ /*进行修改*/
// rect // rect
@ -582,7 +585,11 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){
cur_regionConfigArr[i].basicInfo.pointArry[j] = Point((cur_regionConfigArr[i].basicInfo.pointArry[j].x - new_center.x) * scale_x + new_center.x, (cur_regionConfigArr[i].basicInfo.pointArry[j].y - new_center.y) * scale_y + new_center.y); cur_regionConfigArr[i].basicInfo.pointArry[j] = Point((cur_regionConfigArr[i].basicInfo.pointArry[j].x - new_center.x) * scale_x + new_center.x, (cur_regionConfigArr[i].basicInfo.pointArry[j].y - new_center.y) * scale_y + new_center.y);
} }
} }
for(int i = 0; i < cur_traditional_region.size(); i++){
cur_traditional_region[i].x = m_old_cur_traditional_region[i].x + x_offset;
cur_traditional_region[i].y = m_old_cur_traditional_region[i].y + y_offset;
cur_traditional_region[i] = Point((cur_traditional_region[i].x - new_center.x) * scale_x + new_center.x, (cur_traditional_region[i].y - new_center.y) * scale_y + new_center.y);
}
/*show*/ /*show*/
// Mat show_img = img.clone(); // Mat show_img = img.clone();
// cv::rectangle(show_img, m_AnalysisyConfig.baseFunction.markLine.productROI, Scalar(255), 5); // cv::rectangle(show_img, m_AnalysisyConfig.baseFunction.markLine.productROI, Scalar(255), 5);
@ -1631,6 +1638,14 @@ int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &Re
std::string strBaseLog = "Traditional_Detect"; std::string strBaseLog = "Traditional_Detect";
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "Traditional_Detect Start"); m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "Traditional_Detect Start");
// 输入校验
if (img.empty())
{
m_pdetlog->AddCheckstr(PrintLevel_0, DET_LOG_LEVEL_3, strBaseLog, "Traditional_Detect FAILED (empty image)");
ResultImg = cv::Mat();
return -1;
}
Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet; Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet;
// 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射) // 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射)
static bool bTcsInited = false; static bool bTcsInited = false;
@ -1652,7 +1667,10 @@ int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &Re
bTcsInited = true; bTcsInited = true;
} }
cv::Rect detroi = traditionParam.detArea_ROI; cv::Rect detroi = cv::boundingRect(traditionParam.detArea);
detroi.x -= m_Crop_Roi_paramImg.x;
detroi.y -= m_Crop_Roi_paramImg.y;
detroi = detroi & cv::Rect(0, 0, img.cols, img.rows);
if(!traditionParam.bdetArea) if(!traditionParam.bdetArea)
{ {
detroi = cv::Rect(0, 0, img.cols, img.rows); detroi = cv::Rect(0, 0, img.cols, img.rows);
@ -2254,7 +2272,7 @@ int ImgCheckAnalysisy::Edge_Qx_Det(const cv::Mat &img)
cv::Point pCenter; cv::Point pCenter;
pCenter.x = temerror.roi.x + temerror.roi.width * 0.5; pCenter.x = temerror.roi.x + temerror.roi.width * 0.5;
pCenter.y = temerror.roi.y + temerror.roi.height * 0.5; pCenter.y = temerror.roi.y + temerror.roi.height * 0.5;
int nmaxregionIdx = 0; int nmaxregionIdx = -1;
for (int iregion = 0; iregion < m_DetRoiList.roiList_Src.size(); iregion++) for (int iregion = 0; iregion < m_DetRoiList.roiList_Src.size(); iregion++)
{ {
const std::vector<cv::Point> &polygon = m_DetRoiList.roiList_Src[iregion]; const std::vector<cv::Point> &polygon = m_DetRoiList.roiList_Src[iregion];
@ -2266,8 +2284,11 @@ int ImgCheckAnalysisy::Edge_Qx_Det(const cv::Mat &img)
nmaxregionIdx = iregion; nmaxregionIdx = iregion;
} }
if (nmaxregionIdx >= 0)
{
temerror.detRegionidxList.push_back(nmaxregionIdx); temerror.detRegionidxList.push_back(nmaxregionIdx);
} }
}
// { // {
// cv::Point pCenter; // cv::Point pCenter;
@ -2347,7 +2368,7 @@ int ImgCheckAnalysisy::BLobToDetResult()
cv::Point pCenter; cv::Point pCenter;
pCenter.x = roi.x + roi.width * 0.5; pCenter.x = roi.x + roi.width * 0.5;
pCenter.y = roi.y + roi.height * 0.5; pCenter.y = roi.y + roi.height * 0.5;
int nmaxregionIdx = 0; int nmaxregionIdx = -1;
for (int iregion = 0; iregion < m_DetRoiList.roiList_Src.size(); iregion++) for (int iregion = 0; iregion < m_DetRoiList.roiList_Src.size(); iregion++)
{ {
const std::vector<cv::Point> &polygon = m_DetRoiList.roiList_Src[iregion]; const std::vector<cv::Point> &polygon = m_DetRoiList.roiList_Src[iregion];
@ -2359,8 +2380,11 @@ int ImgCheckAnalysisy::BLobToDetResult()
nmaxregionIdx = iregion; nmaxregionIdx = iregion;
} }
if (nmaxregionIdx >= 0)
{
temerror.detRegionidxList.push_back(nmaxregionIdx); temerror.detRegionidxList.push_back(nmaxregionIdx);
} }
}
// { // {
// cv::Point pCenter; // cv::Point pCenter;

@ -318,14 +318,19 @@ cv::Mat CTcsCheck::DrawBlobInfoImage(const cv::Mat& imgCrop, const cv::Mat& imgB
// ============================================================ // ============================================================
int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& blobImg) int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& blobImg)
{ {
// if (img.empty()) return -1; if (img.empty())
{
blobImg = cv::Mat();
return -1;
}
m_matLoad = img; m_matLoad = img;
// 确保 m_sizeImage 始终与 m_matLoad 同步
m_sizeImage = img.size();
cv::Rect rtCrop = detRoi; cv::Rect rtCrop = detRoi;
if(detRoi.size() == img.size()) if(detRoi.size() == img.size())
{ {
m_sizeImage = img.size();
// 1. 全局阈值 → 产品区域定位 // 1. 全局阈值 → 产品区域定位
cv::Mat matBinary; cv::Mat matBinary;
cv::threshold(m_matLoad, matBinary, m_cpCfg.nAreaLowFilter, 255, cv::THRESH_BINARY); cv::threshold(m_matLoad, matBinary, m_cpCfg.nAreaLowFilter, 255, cv::THRESH_BINARY);
@ -342,6 +347,17 @@ int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& b
rtCrop = GetCropArea(rtValid); rtCrop = GetCropArea(rtValid);
} }
// 安全裁剪: 确保 rtCrop 不超出 m_matLoad 边界
{
const cv::Rect imgRect(0, 0, m_matLoad.cols, m_matLoad.rows);
rtCrop = rtCrop & imgRect;
if (rtCrop.width <= 0 || rtCrop.height <= 0)
{
blobImg = cv::Mat();
return -1;
}
}
cv::Mat matCrop = m_matLoad(rtCrop).clone(); cv::Mat matCrop = m_matLoad(rtCrop).clone();
// 4. 缩放 // 4. 缩放

@ -287,7 +287,7 @@ std::string Extract_ALL::Extract_Channel_Name(std::string strPath, int userflag)
} }
int Extract_ALL::Read_Image_List(std::string strPath, std::string strproduct) int Extract_ALL::Read_Image_List(std::string strPath, std::string strproduct)
{ {
std::string strSearchImgPath = strPath + "/*.png"; std::string strSearchImgPath = strPath + "/*.jpg";
Read_Camera_Product_Image(strSearchImgPath, 0, strproduct); Read_Camera_Product_Image(strSearchImgPath, 0, strproduct);
strSearchImgPath = strPath + "/*.ytimage"; strSearchImgPath = strPath + "/*.ytimage";
@ -298,12 +298,12 @@ int Extract_ALL::Read_Image_List(std::string strPath, std::string strproduct)
int Extract_ALL::Read_Image_List(std::string strPath_left, std::string strPath_right, std::string strproduct) int Extract_ALL::Read_Image_List(std::string strPath_left, std::string strPath_right, std::string strproduct)
{ {
std::string strSearchImgPath = strPath_left + "/*.png"; std::string strSearchImgPath = strPath_left + "/*.jpg";
Read_Camera_Product_Image(strSearchImgPath, 0, strproduct); Read_Camera_Product_Image(strSearchImgPath, 0, strproduct);
strSearchImgPath = strPath_right + "/*.png"; strSearchImgPath = strPath_right + "/*.jpg";
Read_Camera_Product_Image(strSearchImgPath, 0, strproduct); Read_Camera_Product_Image(strSearchImgPath, 0, strproduct);
// strSearchImgPath = strPath + "/*.png"; // strSearchImgPath = strPath + "/*.jpg";
// Read_Camera_Product_Image(strSearchImgPath, 1); // Read_Camera_Product_Image(strSearchImgPath, 1);
return 0; return 0;

@ -1191,7 +1191,7 @@ int deal::GetDetImageInfo(std::string strProductID, std::string strSearchImg, st
std::string strs1 = strSearchImg + "/*.ytimage"; std::string strs1 = strSearchImg + "/*.ytimage";
if(!runConfig.bdecode) if(!runConfig.bdecode)
{ {
strs1 = strSearchImg + "/*.png"; strs1 = strSearchImg + "/*.jpg";
cv::glob(strs1, img_paths, true); cv::glob(strs1, img_paths, true);
} }
cv::glob(strs1, img_paths, true); cv::glob(strs1, img_paths, true);

Loading…
Cancel
Save