opencv 旋转和平移的矩阵

Img
在这里插入图片描述
opencv 图像旋转

	std::vector<std::vector<cv::Point>> contours;
	cv::findContours(Img, contours, 0, 2);
    cv::RotatedRect rotatedrect = minAreaRect(contours[i]);
	double angle = rotaterect.angle;
	cv::Point2f center = rotaterect.center;
	cv::Mat M = cv::getRotationMatrix2D(center, angle, 1);//取得旋转矩阵
	warpAffine(Img, Img, M, cv::Size(Img.cols, Img.rows));//未扩大的进行旋转

opencv 图像平移

			cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);
			M.at<float>(0, 0) = 1;
			M.at<float>(0, 2) = 0; //水平平移量
			M.at<float>(1, 1) = 1;
			M.at<float>(1, 2) = 0; //竖直平移量
			cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000));//图像尺寸扩张Size(500,1000)(默认扩张方式)

	//用固定颜色填充扩张的边界
	//cv::Scalar borderColor = Scalar(255, 255, 255);
	//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_CONSTANT, borderColor);


	//复制边缘填充
	//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_REPLICATE);

关于大M矩阵:

对平移矩阵:
M=[	[scale , 0 , a]		//a水平平移量
	[0 , scale , b]	]	//b竖直平移量
对旋转矩阵:
M=[	[scale*cos(angle)  , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y ]		
	[-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y ]	]	
//scale缩放因子,1表示不进行缩放
//angle旋转角度,正值表示逆时针旋转
//center图像旋转的中心位置
旋转和平移结合:
M=[	[scale*cos(angle)  , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y + a]		
	[-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y + b]	]
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>

using namespace std;
using namespace cv;


int main() {
	string path = R"(circle.png)";

	cv::Mat Img = imread(path, IMREAD_GRAYSCALE);
	cv::threshold(Img, Img, 200, 255, 0);

	cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);
	double scale = 1;//缩放因子,1表示不进行缩放
	double angle = 60.0 / 180.0 * CV_PI;//旋转角度,正值表示逆时针旋转
	cv::Point2f center = cv::Point2f(Img.cols / 2.0, Img.rows / 2.0);//图像旋转的中心位置
	double a = 0;//水平平移量
	double b = 100;//竖直平移量

	M.at<float>(0, 0) = scale * cos(angle);
	M.at<float>(0, 1) = scale * sin(angle);
	M.at<float>(1, 0) = -1 * M.at<float>(0, 1);
	M.at<float>(1, 1) = M.at<float>(0, 0);

	M.at<float>(0, 2) = (1 - M.at<float>(0, 0))*center.x - M.at<float>(0, 1)*center.y + a;
	M.at<float>(1, 2) = M.at<float>(0, 1)*center.x + (1 - M.at<float>(0, 0))*center.y + b;
	cv::Mat Img_R;
	cv::warpAffine(Img, Img_R, M, Img.size() + cv::Size(0, 100));//逆时针旋转angle度即是逆时针旋转60度

	waitKey(0);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值