原理大致就是靠近那个点.就对那个点权重大一点..
原理不多说,直接看一个简单示例:
比如知A,B,C,D 四个角点的坐标.要求出图上点(第二行第三列点..)的 x 坐标.
point.x = x1 * ((6-2)/6) * ((3-1)/3) // 6 是x 方向有六段.3是y方向有三..这里求出受左上角点的权重影响
+ X2 * (2/6) * ((3-1)/3) // 这里求出受右上角点的权重影响
+ X3 * ((6-2)/6) * (1/3) // 这里求出受左下角点的权重影响
+ X4 * (2/6) * (1/3);
// =================================================================================================
// 功能:局部平均, 可以看作对X1_, X2, Y1_, Y2 四点围成的区域作平均
//
// 返回值:true --- 执行成功, false --- 执行失败.
bool CProjectionOpt::realParticalAverage(int X1_, int X2_, int Y1_, int Y2_)
{
// 对局部里面的网格平均
{
int minX = (X1_ < X2_) ? (X1_) : (X2_);
int maxX = (X1_ < X2_) ? (X2_) : (X1_);
int minY = (Y1_ < Y2_) ? (Y1_) : (Y2_);
int maxY = (Y1_ < Y2_) ? (Y2_) : (Y1_);
// 四个角点保持不变.. 其他的点根据这四个点来计算位置
for (int i = minX; i <= maxX; ++i) // 列
{
for (int j = minY; j <= maxY; ++j) // 行
{
CvPoint ptTopLeft = m_GridPoints[minY][minX];
CvPoint ptTopRight = m_GridPoints[minY][maxX];
CvPoint ptBottomLeft = m_GridPoints[maxY][minX];
CvPoint ptBottomRight = m_GridPoints[maxY][maxX];
m_GridPoints[j][i].x =
(ptTopLeft.x) * ((maxX - i)/(double(maxX - minX))) * ((maxY - j)/(double(maxY - minY))) // 受左上角点影响的权重
+ (ptBottomLeft.x) * ((maxX - i)/(double(maxX - minX))) * ((j - minY)/(double(maxY - minY))) // 受左下角点影响的权重
+ (ptTopRight.x) * ((i - minX)/(double(maxX - minX))) * ((maxY - j)/(double(maxY - minY))) // 受右上角点影响的权重
+ (ptBottomRight.x) * ((i - minX)/(double(maxX - minX))) * ((j - minY)/(double(maxY - minY))); // 受右下角点影响的权重
m_GridPoints[j][i].y =
(ptTopLeft.y) * ((maxX - i)/(double(maxX - minX))) * ((maxY - j)/(double(maxY - minY)))
+ (ptBottomLeft.y) * ((maxX - i)/(double(maxX - minX))) * ((j - minY)/(double(maxY - minY)))
+ (ptTopRight.y) * ((i - minX)/(double(maxX - minX))) * ((maxY - j)/(double(maxY - minY)))
+ (ptBottomRight.y) * ((i - minX)/(double(maxX - minX))) * ((j - minY)/(double(maxY - minY)));
}
}
}
return true;
}