一、仿射变换
CV_EXPORTS_W void warpAffine(
InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar()
);
CV_EXPORTS Mat getAffineTransform(
const Point2f src[],
const Point2f dst[]
);
代码
#include
#include
using namespace std;
using namespace cv;
static void test() {
string path = "lena.jpg";
Mat src = cv::imread(path);
if (src.empty()) {
cout << "can not load image" << endl;
return ;
}
cv::Point2f srcTri[] = {
cv::Point2f(0,0),
cv::Point2f(src.cols - 1, 0),
cv::Point2f(0, src.rows - 1)
};
cv::Point2f dstTri[] = {
cv::Point2f(src.cols*0.f, src.rows*0.33f),
cv::Point2f(src.cols*0.85f, src.rows*0.25f),
cv::Point2f(src.cols*0.15f, src.rows*0.7f)
};
cv::Mat warp_mat = cv::getAffineTransform(srcTri, dstTri);
cv::Mat dst, dst2;
cv::warpAffine(
src,
dst,
warp_mat,
src.size(),
cv::INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar()
);
for (int i = 0; i < 3; ++i)
cv::circle(dst, dstTri[i], 5, cv::Scalar(255, 0, 255), -1, cv::LINE_AA);
cv::imshow("Affine Transform Test", dst);
cv::waitKey();
for (int frame = 0;; ++frame) {
cv::Point2f center(src.cols*0.5f, src.rows*0.5f);
double angle = frame * 3 % 360, scale = (cos((angle - 60)* CV_PI / 180) + 1.05)*0.8;
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, scale);
cv::warpAffine(
src,
dst,
rot_mat,
src.size(),
cv::INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar()
);
cv::imshow("Rotated Image", dst);
if (cv::waitKey(30) >= 0)
break;
}
}
int main()
{
test();
system("pause");
return 0;
}
结果
二、透视变化
代码示例
#include
#include
using namespace std;
using namespace cv;
static void test() {
string path = "Image.jpg";
Mat src = cv::imread(path);
if (src.empty()) {
cout << "can not load image" << endl;
return;
}
cv::Point2f srcQuad[] = {
cv::Point2f(0, 0),
cv::Point2f(src.cols - 1, 0),
cv::Point2f(src.cols - 1, src.rows - 1),
cv::Point2f(0, src.rows - 1)
};
cv::Point2f dstQuad[] = {
cv::Point2f(src.cols*0.05f, src.rows*0.33f),
cv::Point2f(src.cols*0.9f, src.rows*0.25f),
cv::Point2f(src.cols*0.8f, src.rows*0.9f),
cv::Point2f(src.cols*0.2f, src.rows*0.7f)
};
cv::Mat warp_mat = cv::getPerspectiveTransform(srcQuad, dstQuad);
cv::Mat dst;
cv::warpPerspective(src, dst, warp_mat, src.size(), cv::INTER_LINEAR,
cv::BORDER_CONSTANT, cv::Scalar());
for (int i = 0; i < 4; i++)
cv::circle(dst, dstQuad[i], 5, cv::Scalar(255, 0, 255), -1, cv::LINE_AA);
cv::imshow("Perspective Transform Test", dst);
cv::waitKey();
}
int main()
{
test();
system("pause");
return 0;
}
结果
三、通用变换
对数——极坐标变换示例
#include
#include
using namespace std;
static void test() {
string path = "Image.jpg";
cv::Mat src = cv::imread(path);
if (src.empty()) {
cout << "can not load image" << endl;
return;
}
double M = 50;
cv::Mat dst(src.size(), src.type()), src2(src.size(), src.type());
cv::logPolar(
src,
dst,
cv::Point2f(src.cols*0.5f, src.rows*0.5f),
M,
cv::INTER_LINEAR | cv::WARP_FILL_OUTLIERS
);
cv::logPolar(
dst,
src2,
cv::Point2f(src.cols*0.5f, src.rows*0.5f),
M,
cv::INTER_LINEAR | cv::WARP_INVERSE_MAP
);
cv::imshow("log-polar", dst);
cv::imshow("inverse log-polar", src2);
cv::waitKey();
}
int main()
{
test();
system("pause");
return 0;
}
结果