opencv实现图像旋转(不被裁剪)

当用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;
}

版权声明:本文为qinqinxiansheng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。