python cv2函数总结resize boxPoints minAreaRect

cv2.resize

cv2.imread读出来的图片是[H,W,3]
然而cv2.resize的想法有点不一样
cv2.resize(im, (dst_w, dst_h))
意思是括号里面的两个参数制定了目标图像的 宽 和 高
举个栗子,我要把某图的宽度折半,高度不变

im=cv2.imread('a.jpg')
im.shape #[ 400, 600 ,3]
im1=cv2.resize(im,(im.shape[1]//2 , im.shape[0]))
im1.shape #[400, 300, 3]

这个语法有一点反人类

cv2.boxPoints

输入形式是((x_center, y_center),(w,h), theta)
正代表顺时针的角度 负代表逆时针角度
下面只统计 -90~90度的情况 暂不考虑90~180和-180~-90 容易绕晕

当输入theta在0~90度时候和-360~-270
从下面的结果可以看出30度和-330度返回的结果相同
即theta=theta-360
并且返回四个点(8个坐标)分别是
左下角 左上角 右上角 右下角

当输入theta在-90~0度和270~360时候
从下面的结果可以看出-30度和330度返回的结果相同
theta=theta+360
并且返回四个点(8个坐标)分别是
左下角 左上角 右上角 右下角

在上述两种情况下 8个点的返回顺序是一致的

box=cv2.boxPoints( ( (50 ,50) ,(10, 10), 30))
array([[43.169872, 51.830128],
       [48.169872, 43.169872],
       [56.830128, 48.169872],
       [51.830128, 56.830128]], dtype=float32)
#
box=cv2.boxPoints( ( (50 ,50) ,(10, 10), -330))
array([[43.169872, 51.830128],
       [48.169872, 43.169872],
       [56.830128, 48.169872],
       [51.830128, 56.830128]], dtype=float32)
#
cv2.boxPoints( ( (50 ,50) ,(10, 10), -30))
array([[48.169872, 56.830128],
       [43.169872, 48.169872],
       [51.830128, 43.169872],
       [56.830128, 51.830128]], dtype=float32)
#
cv2.boxPoints( ( (50 ,50) ,(10, 10), 330))
array([[48.169872, 56.830128],
       [43.169872, 48.169872],
       [51.830128, 43.169872],
       [56.830128, 51.830128]], dtype=float32)

cv2.minAreaRect

输入的形式([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])
如果用cv2.boxPoints的输出给到cv2.minAreaRect
在boxPoints输入的角度是0-90度时候
最终得到theta与原来并不一样
例如

box=cv2.boxPoints( ( (50 ,50) ,(10, 10), 30))#结果在上面代码块
cv2.minAreaRect(box)
结果是
((50.000003814697266, 50.0), (10.000000953674316, 10.000000953674316), -60.0)
即使我改变四个点的顺序
**左下角  左上角 右上角 右下角** ->   **左上角 右上角 右下角 左下角**                           
cv2.minAreaRect(np.array([box[1],box[2],box[3],box[0]],dtype=np.float32))
结果依然是
((50.000003814697266, 50.0), (10.000000953674316, 10.000000953674316), -60.0)
打乱个点的顺序
**左下角  左上角 右上角 右下角** ->**左下角 右上角 左上角 右下角**
cv2.minAreaRect(np.array([box[0],box[2],box[1],box[3]],dtype=np.float32))
结果还是
((50.000003814697266, 50.0), (10.000000953674316, 10.000000953674316), -60.0)

但是
在boxPoints输入的角度是-90 ~0度时候
最终得到theta与原来一样

box0=cv2.boxPoints( ( (50 ,50) ,(10, 10), -30))
cv2.minAreaRect(box0)
结果
((50.000003814697266, 50.000003814697266),
 (10.000000953674316, 10.000000953674316),
 -29.999998092651367)
 #
box0=cv2.boxPoints( ( (50 ,50) ,(10, 10), -60))
#上述等效于box0=cv2.boxPoints( ( (50 ,50) ,(10, 10), 120))
cv2.minAreaRect(box0)
结果
((50.000003814697266, 50.0), (10.000000953674316, 10.000000953674316), -60.0)

参考这篇文章

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值