普通旋转
cv::warpAffine 函数用来旋转图片
c
static cv::Mat RotateMatWithTransparency(const cv::Mat& src, double angle) {
//double angle = 45.0; // 旋转角度
cv::Point2f center(src.cols / 2.0f, src.rows / 2.0f);
cv::Mat rotMat = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Mat dst;
cv::warpAffine(src, dst, rotMat, src.size(), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
return dst;
}
投影变换来做旋转
使用投影变换来代替旋转函数,使用warpPerspective 函数
c
static cv::Mat rotateImageWithProjection(const cv::Mat& image, double angle, cv::Point2f center = cv::Point2f()) {
if (center.x == 0 && center.y == 0) {
center = cv::Point2f(image.cols / 2.0, image.rows / 2.0);
}
// 计算旋转矩阵(投影变换形式)
double rad = angle * CV_PI / 180.0;
double sinVal = sin(rad);
double cosVal = cos(rad);
// 构建3x3投影矩阵
cv::Mat M = (cv::Mat_<double>(3, 3) <<
cosVal, -sinVal, center.x * (1 - cosVal) + center.y * sinVal,
sinVal, cosVal, center.y * (1 - cosVal) - center.x * sinVal,
0, 0, 1
);
// 计算旋转后的图像尺寸,避免裁剪
int newWidth = static_cast<int>(image.cols * fabs(cosVal) + image.rows * fabs(sinVal));
int newHeight = static_cast<int>(image.cols * fabs(sinVal) + image.rows * fabs(cosVal));
// 调整平移量,使图像居中
M.at<double>(0, 2) += (newWidth / 2.0) - center.x;
M.at<double>(1, 2) += (newHeight / 2.0) - center.y;
// 应用投影变换
cv::Mat rotated;
warpPerspective(image, rotated, M, cv::Size(newWidth, newHeight),
cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
return rotated;
}