重映射
cv::Mat src = cv::imread("1.jpg");
if (!src.data)
{
cout << "error" << endl;
return -1;
}
cv::Mat dst,map_x,map_y;
dst.create(src.size(), src.type());
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1);
for (int j = 0; j < src.rows; j++)
{
for (int i = 0; i < src.cols; i++)
{
map_x.at<float>(j, i) = static_cast<float>(i);
map_y.at<float>(j, i) = static_cast<float>(src.rows - j);
}
}
remap(src,
dst,
map_x,
map_y,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT);
cv::imshow("原图", src);
cv::imshow("remap 效果图", dst);
仿射变换
cv::Mat src = cv::imread("1.jpg");
if (!src.data)
{
cout << "error" << endl;
return -1;
}
cv::Point2f srcTriangle[3];
cv::Point2f dstTriangle[3];
cv::Mat rotMat(2, 3, CV_32FC1);
cv::Mat warpMat(2, 3, CV_32FC1);
cv::Mat dstImage_warp, dstImage_warp_rotate;
dstImage_warp = cv::Mat::zeros(src.rows, src.cols, src.type());
srcTriangle[0] = cv::Point2f(0, 0);
srcTriangle[1] = cv::Point2f(static_cast<float>(src.cols - 1), 0);
srcTriangle[2] = cv::Point2f(0, static_cast<float>(src.rows - 1));
dstTriangle[0] = cv::Point2f(static_cast<float>(src.cols*0.0), static_cast<float>(src.rows*0.33));
dstTriangle[1] = cv::Point2f(static_cast<float>(src.cols*0.65), static_cast<float>(src.rows*0.35));
dstTriangle[2] = cv::Point2f(static_cast<float>(src.cols*0.15), static_cast<float>(src.rows*0.6));
warpMat = cv::getAffineTransform(srcTriangle, dstTriangle);
cv::warpAffine(src,
dstImage_warp,
warpMat,
dstImage_warp.size());
cv::Point center = cv::Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);
double angle = -50.0;
double scale = 0.6;
rotMat = getRotationMatrix2D(center, angle, scale);
cv::warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());
cv::imshow("原图", src);
cv::imshow("Warp 效果图", dstImage_warp);
cv::imshow("Warp和Rotate 效果图", dstImage_warp_rotate);