@nrailgun
2016-07-24T16:45:44.000000Z
字数 1714
阅读 1671
程序设计
实际上 OpenCV 在进行仿射变换的时候,计算是从 destination 映射回 source
但是仿射变换的接口
void warpAffine(
InputArray src, OutputArray dst, InputArray M, Size dsize,
int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar());
接受的变换矩阵却是
我们称将
OpenCV 通过
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
OpenCV 提供了简单的计算逆变换矩阵的接口。
void invertAffineTransform(InputArray M, OutputArray iM);
如果有些时候我们需要变换旋转中心(也就是 Shift / Translation),只需要简单的叠加变换矩阵。
Mat_<float> affine_matrix(
const Point2i &src, const Point2i &dst, const float angle, const float scale)
{
Mat_<float> M(2, 3);
M(0, 0) = scale * std::cos(angle);
M(0, 1) = scale * std::sin(angle);
M(0, 2) = (1 - M(0, 0)) * dst.x - M(0, 1) * dst.y;
M(1, 0) = -M(0, 1);
M(1, 1) = M(0, 0);
M(1, 2) = M(0, 1) * dst.x + (1 - M(0, 0)) * dst.y;
Mat_<float> T(3, 3);
T(0, 0) = 1;
T(0, 1) = 0;
T(0, 2) = dst.x - src.x;
T(1, 0) = 0;
T(1, 1) = 1;
T(1, 2) = dst.y - src.y;
T(2, 0) = 0;
T(2, 1) = 0;
T(2, 2) = 1;
return M * T;
}
使用方式和普通仿射变换无异。
Mat src, dst;
src = imread("kuuga.jpg", -1);
dst = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);
Point2f src_center(0, 0);
Point2f dst_center(50, 50);
Mat M = affine_matrix(src_center, dst_center, 1.5, 1);
warpAffine(src, dst, M, dst.size());