OpenCV中仿射变换warpAffined和getRotationMatrix2D ——python

opencv实现仿射变换

warpAffined

void cv::warpAffine ( InputArray src,OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar() )
参数解释

  • src 输入图像
  • dst 输出图像,尺寸由dsize决定,类型与输入图像一致
  • M:2*3尺寸的变换矩阵
  • disze 输出图像的尺寸
  • flags:插值算法标识符
    • INTER_NEAREST(最近邻插值)、INTER_LINEAR(线性插值)、INTER–CUBIC(双立方插值)、INTER_AREA(区域插值)、INTER_LANCZOS4(Lanczos插值)、INTER_MAX(用于插值的掩模板)、WARP_FILL_OUTLIERS(,用于填充目标图像的像素值)、WARP_INVERSE_MAP(反变换)
  • borderMode:边界模式
  • borderValue:边界取值
getRotationMatrix2D

Mat getRotationMatrix2D(Point2f center, double angle, double scale)
参数解释:

  • center:表示源图像的中心
  • angle:旋转角度,正值为逆时针旋转
  • scale:缩放系数
python

旋转

import cv2
img=cv2.imread('D://man.png')
rows,cols,_ = img.shape
#90度旋转
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('origin',img)
cv2.imshow('rotate',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
平移

import cv2
import numpy as np
img=cv2.imread('D://man.png')
rows,cols,_ = img.shape
# 平移矩阵M:[[1,0,x],[0,1,y]]
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('origin',img)
cv2.imshow('translate',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

C++

旋转

cv::Mat src = cv::imread("lenna.jpg");
	cv::Mat dst;
 
	//旋转角度
	double angle = 90;
 
	cv::Size src_sz = src.size();
	cv::Size dst_sz(src_sz.height, src_sz.width);
	int len = std::max(src.cols, src.rows);
 
	//指定旋转中心(图像中点)
	cv::Point2f center(len / 2., len / 2.);
	
	//获取旋转矩阵(2x3矩阵)
	cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
 
	//根据旋转矩阵进行仿射变换
	cv::warpAffine(src, dst, rot_mat, dst_sz);
 
	//显示旋转效果
	cv::imshow("image", src);
	cv::imshow("result", dst);
 
	cv::waitKey(0);
 
	return 0;

平移

	cv::Mat src = cv::imread("lenna.jpg");
	cv::Mat dst;
 
	cv::Size dst_sz = src.size();
	
	//定义平移矩阵
	cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);
 
	t_mat.at<float>(0, 0) = 1;
	t_mat.at<float>(0, 2) = 20; //水平平移量
	t_mat.at<float>(1, 1) = 1;
	t_mat.at<float>(1, 2) = 10; //竖直平移量
 
	//根据平移矩阵进行仿射变换
	cv::warpAffine(src, dst, t_mat, dst_sz);
 
	//显示平移效果
	cv::imshow("image", src);
	cv::imshow("result", dst);
 
	cv::waitKey(0);
 
	return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值