[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)
效果呈现