图片和其边框旋转变化

主要是关于图片旋转以及其上点的变化

我要做的是增加数据,旋转图片形成新数据,那其上目标框发生变化,就要形成新目标框box,就去找原框的四个点进行旋转后得到的点,选择其最大最小x,y,形成新框。自己研究一天考了很多资料,但最后还是选用现有opencv算法进行旋转(真滴快0-0)
虽然结果很完美
#特别慢:每一张图都要全遍历一次,机器直接跑一圈慢了10多分钟。(人都傻了当时)
参考

参考一个做的很好的理论分析到位的博文,讲解了旋转理论和客观性不错的实例。
理论我懂了,但代码在深度学习里就是慢
参考
那么接下来
那么接下来找现成的矩阵变换的0-0
直接使用opencv现有包进行旋转,大神还是多,我是菜鸡
参考

下面展示一些 能运行的代码

image 格式一定要看呀
angle 旋转度(我做的是逆时针,参考理论的博文可以自己改)
box 目标框的最大最小值[x_min,y_min,x_max,y_max] 
这里只是单个的目标框,如果多个,直接for box in boxs:#完事
-*- coding: utf-8 -*-
from numpy import *
from PIL import Image,ImageDraw, ImageFont
from PIL import Image
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
#我要求的是box旋转后形成新的box_new,如果仅仅是旋转,直接看链接博客#
#box我的数据格式[x_min,y_min,x_max,y_max]#


def rotate_bound(image, angle,box,flag=True):
    # grab the dimensions of the image and then determine the
    # center

    #------------------------------------------------#
    #主要还是要看你的读入图片是不是np.array格式,不是一定要转#
    #------------------------------------------------#
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)
    #---------------------------------------------------#
    #以下时为了找到旋转后box的的x,y最大最小值,返回box_new#
    #----------------------------------------------------#
    box_xx = []
    box_yy = []
    box_new = box
    x_min = box[0]
    y_min = box[1]
    x_max = box[2]
    y_max = box[3]
    #得到一个旋转后的图具体看链接的讲解
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # 新的宽,高。当然也可以用其他方法计算新的宽高(链接里有其他计算方法)#
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    #因为我的数据原因,我做的是逆时针旋转,当然也可正向,计算的公式可以看链接#
    angle_new = -math.radians(angle % 360)
    for x0,y0 in ((x_min,y_min),(x_min,y_max),(x_max,y_min),(x_max,y_max)):
        x = x0 * math.cos(angle_new) - y0 * math.sin(angle_new) + 0.5 * h * math.sin(angle_new) - 0.5 * w * math.cos(angle_new) + 0.5 * nW
        y = x0 * math.sin(angle_new) + y0 * math.cos(angle_new) - 0.5 * w * math.sin(angle_new) - 0.5 * h * math.cos(angle_new) + 0.5 * nH
        box_xx.append(x)
        box_yy.append(y)
    box_new[0] = math.floor(min(box_xx))
    box_new[2] = math.ceil(max(box_xx))
    box_new[1] = math.floor(min(box_yy))
    box_new[3] = math.ceil(max(box_yy))
    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
    #cv2.warpAffine(image, M, (nW, nH)) 还是得注意数据格式,#
    # 记得和接下来要求的格式相同就行#
    if flag:
        return cv2.warpAffine(image, M, (nW, nH)),box_new
    else:
        return box_new

结果如下:旋转前

旋转后

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值