当用opencv读取照片时,很多时候图像都是经过旋转90度后的,而opencv又没有直接给出旋转图像的函数
函数1是用来旋转图像的函数(由于图像长与宽不相等,图像会被裁剪)
函数2在旋转90度后,图像不被裁剪(首先先将图像扩充为正方形,然后再旋转)
函数1
void rotate(cv::Mat src, cv::Mat& dst, double angle)
{
cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.width, src_sz.height);
cv::Point center = cv::Point(src.cols / 2, src.rows / 2);//旋转中心
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);//获得仿射变换矩阵
cv::warpAffine(src, dst, rot_mat, dst_sz);
}
函数2
cv::Mat rotate(cv::Mat src, double angle)
{
cv::Mat dst;//目标图像
cv::Size src_sz = src.size();
cv::Size src_ext_sz = src.size();
src_ext_sz.height= src_ext_sz.width;
Mat src_ext = Mat::zeros(src_ext_sz, CV_8UC3);;//扩充后的原图像
cv::Mat tempRoi(src_ext,cv::Rect(0, (src_sz.width - src_sz.height)/2, src.cols, src.rows));
src.copyTo(tempRoi);
cv::Size dst_sz(src_ext_sz.width, src_ext_sz.height);
cv::Point center = cv::Point(src_ext.cols / 2, src_ext.rows / 2);//旋转中心
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);//获得仿射变换矩阵
cv::warpAffine(src_ext, dst, rot_mat, dst_sz);
return dst;
}