opencv 旋转和平移的矩阵

opencv 旋转和平移的矩阵_第1张图片
opencv 旋转和平移的矩阵_第2张图片
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
#include
#include

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

你可能感兴趣的:(opencv,计算机视觉,图像处理)