diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index 842b128..738cd00 100644 --- a/AlgorithmModule/src/CameraCheckAnalysisy.cpp +++ b/AlgorithmModule/src/CameraCheckAnalysisy.cpp @@ -169,7 +169,7 @@ int CameraCheckAnalysisy::Detect_Pre() // pImageResult->result->in_shareImage->strCameraName, pImageResult->result->in_shareImage->strChannel); // 简单硬拼接:img 在左,img_B 在右,拼接结果写回 img - // 先去掉左图最右边overlap区域,再做首行判断与上下对齐,最后水平拼接 + // 先把重叠区 overlap 左右各裁一半,再做顶边对齐,最后水平拼接 if (pImageResult->result->in_shareImage->img.size() != pImageResult->result->in_shareImage->img_B.size() || pImageResult->result->in_shareImage->img.type() != pImageResult->result->in_shareImage->img_B.type()) { @@ -179,14 +179,27 @@ int CameraCheckAnalysisy::Detect_Pre() cv::Mat &img = pImageResult->result->in_shareImage->img; cv::Mat &img_B = pImageResult->result->in_shareImage->img_B; - // 1、先裁剪左图: 固定去掉左图最右侧与右图重叠的 overlap 区域 + // 1、裁剪重叠区域: overlap 区域左右各裁一半 + // 左图裁掉最右侧 cutLeft, 右图裁掉最左侧 cutRight, 两者之和等于 overlap, 拼接后总宽度与原逻辑一致 int overlap = cvRound(m_pbaseCheckFunction->markLine.hoverlap); - if (img.cols <= overlap) + if (overlap > 0 && (img.cols <= overlap || img_B.cols <= overlap)) { m_pdetlog->AddCheckstr(PrintLevel_1, "Detect_Pre", "Cam %s ==================img.cols <= overlap %d ", strBasic.c_str(), overlap); return 1; } - img = img(cv::Rect(0, 0, img.cols - overlap, img.rows)); + const int cutLeft = overlap / 2; // 左图右侧裁掉的宽度 + const int cutRight = overlap - cutLeft; // 右图左侧裁掉的宽度 + if (cutLeft > 0) + { + img = img(cv::Rect(0, 0, img.cols - cutLeft, img.rows)); + } + if (cutRight > 0) + { + img_B = img_B(cv::Rect(cutRight, 0, img_B.cols - cutRight, img_B.rows)); + } + + m_pdetlog->AddCheckstr(PrintLevel_1, "Detect_Pre", "Cam %s ==================overlap %d cutLeft %d cutRight %d L.cols %d R.cols %d", + strBasic.c_str(), overlap, cutLeft, cutRight, img.cols, img_B.cols); // 拼接缝: 左图右边界在拼接图中的 x const int seamX = img.cols; diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 7f4c747..474b633 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -2371,6 +2371,26 @@ int ImgCheckAnalysisy::DrawResult_Step_1() float fs_resize_x = m_pImageAllResult->resultImg.cols * 1.0f / m_pImageAllResult->detImg.cols; float fs_resize_y = m_pImageAllResult->resultImg.rows * 1.0f / m_pImageAllResult->detImg.rows; + // 绘制产品旋转外接矩形(m_rot_cur_roi, 原图坐标)的四个角点:黄色、半径 2 pix + if (m_bRotCurRoiValid && !m_CheckResult_shareP->resultimg.empty()) + { + cv::Point2f rot_vertices[4]; + m_rot_cur_roi.points(rot_vertices); + for (int i = 0; i < 4; i++) + { + // 原图坐标 -> 检测图坐标(减去裁剪偏移) -> 结果图坐标(缩放) + cv::Point p; + p.x = cvRound((rot_vertices[i].x - m_Crop_Roi_paramImg.x) * fs_resize_x); + p.y = cvRound((rot_vertices[i].y - m_Crop_Roi_paramImg.y) * fs_resize_y); + cv::circle(m_CheckResult_shareP->resultimg, p, 2, cv::Scalar(0, 255, 255), cv::FILLED); + } + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_3, "DrawResult", "rot ROi corners (%d,%d) (%d,%d) (%d,%d) (%d,%d) -> show", + cvRound(rot_vertices[0].x), cvRound(rot_vertices[0].y), + cvRound(rot_vertices[1].x), cvRound(rot_vertices[1].y), + cvRound(rot_vertices[2].x), cvRound(rot_vertices[2].y), + cvRound(rot_vertices[3].x), cvRound(rot_vertices[3].y)); + } + // 要绘制结果 if (m_pbaseCheckFunction && m_pbaseCheckFunction->edgeDet.bDrawResult) { @@ -2782,6 +2802,20 @@ int ImgCheckAnalysisy::CalProductSize() m_pdetlog->AddCheckstr(PrintLevel_1, "Det ROI", " [x%d, y%d, w %d,h %d] (piexl) -> [w %f h %f](mm),scale %f %f", m_CutRoi.x, m_CutRoi.y, m_CutRoi.width, m_CutRoi.height, fw, fh, m_fImgage_Scale_X, m_fImgage_Scale_Y); + + // 打印产品旋转矩形的四角坐标(原图坐标系),便于核对尺寸换算与后续坐标映射 + if (m_bRotCurRoiValid) + { + cv::Point2f rot_vertices[4]; + m_rot_cur_roi.points(rot_vertices); + m_pdetlog->AddCheckstr(PrintLevel_1, "Det ROI", " rot_cur_roi center (%f,%f) size (%f,%f) angle %f corners (%f,%f) (%f,%f) (%f,%f) (%f,%f)", + m_rot_cur_roi.center.x, m_rot_cur_roi.center.y, + m_rot_cur_roi.size.width, m_rot_cur_roi.size.height, m_rot_cur_roi.angle, + rot_vertices[0].x, rot_vertices[0].y, + rot_vertices[1].x, rot_vertices[1].y, + rot_vertices[2].x, rot_vertices[2].y, + rot_vertices[3].x, rot_vertices[3].y); + } return 0; }