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