|
|
#ifndef _ImgMmPatch_HPP_
|
|
|
#define _ImgMmPatch_HPP_
|
|
|
|
|
|
// ============================================================================
|
|
|
// 【临时补丁】产品长度方向(y) 像素 -> 物理毫米 的分段换算
|
|
|
//
|
|
|
// 背景:产品沿长度方向运动/扫描时速率不恒定(尾端有拉伸),像素↔mm 不是单一
|
|
|
// 比例,实测标定出 5 段,每段斜率不同。
|
|
|
//
|
|
|
// 分段表(分段点 = 像素,**以产品顶边为 0 点**;斜率为 mm/px)见函数内
|
|
|
// yPx1..yPx5 / pmm1..pmm5,改标定只需改那一段(此处不重复写数值,避免两处不同步)。
|
|
|
// 分段点处前后两段取值相同,函数连续,不会在分段点跳变。
|
|
|
//
|
|
|
// 共用方(必须共用同一张表,否则"产品高度"和"缺陷坐标"会各用一把尺子):
|
|
|
// 1) 缺陷 y 物理坐标:ImageResultJudge::BuildDefectImage()
|
|
|
// 2) 产品物理高度 :ImgCheckAnalysisy::CalProductSize()
|
|
|
//
|
|
|
// 注:正式方案建议把这张分段表放进配置(json),由标定数据下发;这里先硬编码。
|
|
|
// ============================================================================
|
|
|
inline float PixelYToMm(float fYPixel)
|
|
|
{
|
|
|
// ================= 标定参数:改标定只需改这一段 =================
|
|
|
// 各段斜率(mm/px)
|
|
|
const float pmm1 = 0.016869;
|
|
|
const float pmm2 = 0.016463;
|
|
|
const float pmm3 = 0.016220;
|
|
|
const float pmm4 = 0.015669;
|
|
|
const float pmm5 = 0.014337;
|
|
|
// 各段起始像素(以产品顶边为 0 点)
|
|
|
const float yPx1 = 0.0f;
|
|
|
const float yPx2 = 10928.0f;
|
|
|
const float yPx3 = 17002.0f;
|
|
|
const float yPx4 = 23167.0f;
|
|
|
const float yPx5 = 29549.0f;
|
|
|
// 各段像素长度(px)
|
|
|
const float dPx1 = yPx2 - yPx1;
|
|
|
const float dPx2 = yPx3 - yPx2;
|
|
|
const float dPx3 = yPx4 - yPx3;
|
|
|
const float dPx4 = yPx5 - yPx4;
|
|
|
|
|
|
// 各段末端的累计物理长度(mm)
|
|
|
const float d1 = dPx1 * pmm1;
|
|
|
const float d2 = d1 + dPx2 * pmm2;
|
|
|
const float d3 = d2 + dPx3 * pmm3;
|
|
|
const float d4 = d3 + dPx4 * pmm4;
|
|
|
|
|
|
if (fYPixel < yPx2)
|
|
|
{
|
|
|
return fYPixel * pmm1;
|
|
|
}
|
|
|
if (fYPixel < yPx3)
|
|
|
{
|
|
|
return (fYPixel - yPx2) * pmm2 + d1;
|
|
|
}
|
|
|
if (fYPixel < yPx4)
|
|
|
{
|
|
|
return (fYPixel - yPx3) * pmm3 + d2;
|
|
|
}
|
|
|
if (fYPixel < yPx5)
|
|
|
{
|
|
|
return (fYPixel - yPx4) * pmm4 + d3;
|
|
|
}
|
|
|
return (fYPixel - yPx5) * pmm5 + d4;
|
|
|
}
|
|
|
|
|
|
#endif
|