首页 > 解决方案 > 我尝试使用函数旋转矩形,但框位置不正确

问题描述

代码确实将点旋转为我输入的角度,但是框的输出排列不正确..请检查我的代码吹了..我希望每个框都以我输入的角度旋转,但同时我希望它在正确的行和列

import cv2
import numpy as np
import math




def rotate( points, angle):
    ANGLE = np.deg2rad(angle)
    ANGLE = np.deg2rad(angle)
    c_x, c_y = np.mean(points, axis=0)

    return np.array(
        [
            [
                c_x  + math.cos(ANGLE) * (pxl - c_x) - math.sin(ANGLE) * (py - c_x),
                c_y + math.sin(ANGLE) * (pxl - c_y) + math.cos(ANGLE) * (py - c_y)
            ]
            for pxl, py in points
        ]
    ).astype(int)




imgc = np.zeros((500, 500, 3), np.uint8)
box = 0
box2 = 0


for i in range(1,10,1):
    box2 = box2 + 25
    box = 0

    for x in range(1, 10, 1):
        p0 = (box, box2)
        p1 = (0 + box, box2 + 20)
        p2 = (20 + box, box2 + 20)
        p3 = (box + 20, box2)

        box = box + 25

        p0, p1, p2, p3 = rotate((p0, p1, p2, p3), 45)
        pp = np.array([p0, p1, p2, p3])
        cv2.drawContours(imgc, [pp], 0, (255, 255, 255), -1, cv2.LINE_AA)



cv2.imshow("image",imgc)

cv2.waitKey()

标签: pythoncv2

解决方案


你以错误的方式移动到中心。

c_x首先,您从px和中减去py。在第二个中,您从和中
减去。c_ypxpy

... + ... * (pxl - c_x) - ... * (py - c_x),   # only `c_x`
... + ... * (pxl - c_y) - ... * (py - c_y),   # only `c_y`

c_x但是你应该总是只减去px而不是py
你应该c_y总是只减去py但不减去px

 ... + ... * (px - c_x) - ... * (py - c_y)
 ... + ... * (px - c_x) - ... * (py - c_y)

def rotate(points, angle):
    ANGLE = np.deg2rad(angle)
    SIN = math.sin(ANGLE)
    COS = math.cos(ANGLE)
    
    c_x, c_y = np.mean(points, axis=0)

    return np.array(
        [
            [
                c_x + COS * (px - c_x) - SIN * (py - c_y),
                c_y + SIN * (px - c_x) + COS * (py - c_y),
            ]
            for px, py in points
        ]
    ).astype(int)

旋转前:

在此处输入图像描述

旋转后:

在此处输入图像描述


推荐阅读