【opencv实现滑动条拖动控制图片旋转(逆时针0-90度)】

[opencv学习记录]

作业内容

1、窗口大小设置为宽400*高600
2、使用滑动条拖动控制图片旋转(逆时针旋转0-90度)

思路

在这一章中,我们将分成滑动条和旋转两块部分进行介绍。
具体步骤:
1.确定图片中心
2.确定2D旋转矩阵
3.使用上一步创建的矩阵对图像应用仿射变换
4.将以上步骤放入一个回调函数中,使用滑动条设置旋转角度和指向此函数的指针

滑动条

OpenCV中的cv::createTrackbar()函数用于创建一个可以连续调整数值的滑动条。其函数原型如下:

int createTrackbar(
const String& trackbarname,//滑块名称
const String& winname,//滑动条对应窗口的名称
int* value,//创建滑动条时,滑块的位置指向一个整型变量的指针
int count,//滑块可以到达最大位置的值,最小的位置的值始终是0
TrackbarCallback onChange = 0,//指向回调函数的指针
void* userdata = 0 //滚动滑块时,用户传给回调函数的数据的指针
);

使用opencv进行图片旋转

opencv使用cv::warpAffine()函数来进行仿射变换,其函数原型如下:

void warpAffine(
InputArray src,//输入图像
OutputArray dst,//输出图像,位深度与图像一致
InputArray M,//仿射变换矩阵
Size dsize,//输出图像大小
int flags = INTER_LINEAR,//像素插值方法,默认是双线性插值
int borderMode = BORDER_CONSTANT, //边界扩充方法,默认值取常数
const Scalar& borderValue = Scalar() //边界填充值
);

仿射变换的关键是确定仿射变换矩阵M,这里有几种方法可以确定:如果已知变换前后的多组特征点的坐标,矩阵M可以用cv::getAffineTransform()来确定,这里需要输入变换前后的3个点对;如果知道图像的旋转角度和缩放比例,则可以利用函数cv::getRotationMatrix2D()来确定;如果知道确切的仿射变换类型,则也可以尝试直接写出矩阵。

在这一题中,已知旋转角度,所以我们采用cv::getRotationMatrix2D()函数,以下是创建2D矩阵的语法:

getRotationMatrix2D(center,angle,scale)

参数说明:
• center: 旋转中心
• angle: 旋转角度
• scale: 缩放比例

Python代码实现

import cv2
img = cv2.imread('E:/lenna.bmp')#读取图片
h,w,c = img.shape#用img.shape得长和宽
center = (w/2,h/2)#旋转中心为图片的中心
def fun(n):
    M = cv2.getRotationMatrix2D(center,n,1)#旋转角度正值为逆时针
    img1 = cv2.warpAffine(img,M,(w,h),borderValue=(255,255,255))#边界填充值设置为白色
    cv2.imshow("win",img1)
    
cv2.namedWindow("win",cv2.WINDOW_NORMAL)
cv2.resizeWindow("win",400,600)
cv2.createTrackbar("bar","win",0,90,fun)#滑块最小位置为0,最大位置90
fun(0)

效果呈现

原图
最终效果图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值