图像,也就是图像中的点坐标变换,实际就是通过一个2*3的矩阵计算而变换的。前面2行2列做缩放或者旋转,后面2行1列做平移。方程不会打字,拍了以前的笔记:
现在我用了个最简单的平移仿射做测试,就是x+100, y+50
我以(0,0)(100,0)(0,50)三点平移变换到(100,50)(200,50)(100,100)三点,那么正确的矩阵应该是1 0 100,0 1 50,则正确;
再根据这个仿射矩阵计算(50,25)(100,25)(100,50)这三点仿射后的三点位置,如果结果是(150,75)(200,75)(200,100),则正确;
首先,仿射变换的原型cv::Mat cv::getAffineTransform(const cv::Point2f* src, const cv::Point2f* dst);
这里src和dst是包含三个二维点的数组。 这个很好赋值,但是读取2*3仿射矩阵时,要特别小心数据类型,这个矩阵的元素类型是CV_64FC1,可以通过Mat的type或者depth方法查看,也就是说元素里的数据是double型的,一定要这样affineMat.at<double>(i,j)读取,将double错用了float,int等,将得到毫不相关的错误数据!!
Mat affineMat = getAffineTransform(triangleA, triangleB);
qDebug() << CV_MAT_DEPTH(affineMat.depth())<< "-----depth";
for (int i = 0; i < affineMat.rows; i++)
{
for (int j = 0; j < affineMat.cols; j++) {
qDebug() << affineMat.at<double>(i,j); //这里类型写错成float等就会得到错值
}
}
附