Python OpenCV根据根据中心点、宽高、倾斜角度画矩形

本文介绍了一个使用Python OpenCV库绘制倾斜矩形的目标识别结果的方法。该方法通过获取目标的中心坐标、宽度、高度及旋转角度来计算矩形的四个顶点,并用线段连接这些点以形成矩形。此外,还展示了如何读取图像文件并绘制特定数据集上的多边形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近在做目标识别的算法,需要对给定的数据进行格式转换,需要先画出来看看

import cv2
import numpy as np
import math


def draw(img, result):
    
    # 下面几个参数,可能需要根据自己的数据进行调整
    x = int(result[0][0])  # 矩形框的中心点x
    y = int(result[0][1])  # 矩形框的中心点y
    angle = result[2]      # 矩形框的倾斜角度(长边相对于水平)
    width, height = int(result[1][0]), int(result[1][1])  # 矩形框的宽和高
    # if result[1][0] > result[1][1]:
    #     height, width = int(result[1][0]), int(result[1][1])
    # else:
    #     height, width = int(result[1][1]), int(result[1][0])
    anglePi = angle * math.pi / 180.0  # 计算角度
    cosA = math.cos(anglePi)
    sinA = math.sin(anglePi)

    x1 = x - 0.5 * width
    y1 = y - 0.5 * height

    x0 = x + 0.5 * width
    y0 = y1

    x2 = x1
    y2 = y + 0.5 * height

    x3 = x0
    y3 = y2

    x0n = (x0 - x) * cosA - (y0 - y) * sinA + x
    y0n = (x0 - x) * sinA + (y0 - y) * cosA + y

    x1n = (x1 - x) * cosA - (y1 - y) * sinA + x
    y1n = (x1 - x) * sinA + (y1 - y) * cosA + y

    x2n = (x2 - x) * cosA - (y2 - y) * sinA + x
    y2n = (x2 - x) * sinA + (y2 - y) * cosA + y

    x3n = (x3 - x) * cosA - (y3 - y) * sinA + x
    y3n = (x3 - x) * sinA + (y3 - y) * cosA + y

    # 根据得到的点,画出矩形框
    cv2.line(img, (int(x0n), int(y0n)), (int(x1n), int(y1n)), (0, 0, 255), 1, 4)
    cv2.line(img, (int(x1n), int(y1n)), (int(x2n), int(y2n)), (0, 0, 255), 1, 4)
    cv2.line(img, (int(x2n), int(y2n)), (int(x3n), int(y3n)), (0, 0, 255), 1, 4)
    cv2.line(img, (int(x0n), int(y0n)), (int(x3n), int(y3n)), (0, 0, 255), 1, 4)


data = [(1275, 458), (1494, 88), (1418, 43), (1200, 414), (1275, 458)]
img_pth = r"E:\BaiduNetdiskDownload\FAIR1M\train\part1\images\0.tif"
img = cv2.imread(img_pth)
sp = img.shape
print(sp[0], sp[1])
for i in range(0, len(data) - 1):
    cv2.line(img, data[i], data[i + 1], (0, 255, 0), 1, 4)

data = np.array(data)
rect = cv2.minAreaRect(data)  # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
cv2.circle(img, (int(rect[0][0]), int(rect[0][1])), 1, (0, 0, 255), 4)  # 画中心点
draw(img, rect)
print(rect)

cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
cv2.imshow('image', img)
cv2.waitKey(10000)  # 显示 10000 ms 即 10s 后消失
cv2.destroyAllWindows()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值