今天学习affine transformation,这个变换充分体现了数学之美,怪不得有那么一句话,“科学中的皇后是数学”。
这个变换包含旋转,错切,翻转等,这里只通过学习旋转,来了解其中的共性。不同的变换只是核矩阵不同。
我们只来看看旋转,旋转是如何实现的,网上有关于旋转矩阵核的推导,很简单。
如:
http://ask.csdn.net/questions/218260
至于旋转的原理或者公式,网上也是很多,这里暂不多写。
这个是逆时针旋转了45度。
for (int i = 0; i < srcMat.cols ; i ++)
for (int j = 0; j < srcMat.rows ; j ++)
{//把图像坐标系转换成x, y坐标系
x = i - x0;
y = -(j - y0);
//对x,y 坐标系中的点作旋转变换
X = x * cos(w) - y * sin(w);
Y = x * sin(w) + y * cos (w);
//如果变换后的坐标不超出x, y坐标系的四周
if ( -(srcMat.cols - x0 ) < X and
X < srcMat.cols - x0 and
-(srcMat.rows - y0) < Y and
Y < srcMat.rows - y0)
{//把x,y坐标系还原成图像坐标系
X = X + x0;
//Y = Y-y0,恢复到第四象限
//前面取负,让Y值变正
Y = -(Y - y0);
tmpMat.at<uchar>(Y, X) =
srcMat.at<uchar>(j, i);
}
}
程序并不复杂,实现了绕中心点x0, y0的逆时针旋转。但是由于用的坐标系不同,需要进行变换,而变换这一块倒是容易让人想不明白。