update 修改拼接方式

dev_lsy
liusiyang 4 days ago
parent e138c826a5
commit 40d1e97ec9

@ -169,7 +169,7 @@ int CameraCheckAnalysisy::Detect_Pre()
// pImageResult->result->in_shareImage->strCameraName, pImageResult->result->in_shareImage->strChannel); // pImageResult->result->in_shareImage->strCameraName, pImageResult->result->in_shareImage->strChannel);
// 简单硬拼接img 在左img_B 在右,拼接结果写回 img // 简单硬拼接img 在左img_B 在右,拼接结果写回 img
// 先去掉左图最右边overlap区域再做首行判断与上下对齐,最后水平拼接 // 先把重叠区 overlap 左右各裁一半,再做顶边对齐,最后水平拼接
if (pImageResult->result->in_shareImage->img.size() != pImageResult->result->in_shareImage->img_B.size() || 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()) 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 = pImageResult->result->in_shareImage->img;
cv::Mat &img_B = pImageResult->result->in_shareImage->img_B; cv::Mat &img_B = pImageResult->result->in_shareImage->img_B;
// 1、先裁剪左图: 固定去掉左图最右侧与右图重叠的 overlap 区域 // 1、裁剪重叠区域: overlap 区域左右各裁一半
// 左图裁掉最右侧 cutLeft, 右图裁掉最左侧 cutRight, 两者之和等于 overlap, 拼接后总宽度与原逻辑一致
int overlap = cvRound(m_pbaseCheckFunction->markLine.hoverlap); 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); m_pdetlog->AddCheckstr(PrintLevel_1, "Detect_Pre", "Cam %s ==================img.cols <= overlap %d ", strBasic.c_str(), overlap);
return 1; 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 // 拼接缝: 左图右边界在拼接图中的 x
const int seamX = img.cols; const int seamX = img.cols;

@ -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_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; 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) 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_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); 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; return 0;
} }

Loading…
Cancel
Save