python——获取矩形四个角点的坐标

任务描述

已知矩形中点[row, col],矩形主方向(自定义)与水平轴的夹角angle,长height,宽bottom。
获取矩形四个角点的坐标。

代码

def rect_loc(row, col, angle, height, bottom):
    assert angle <= 35, 'angle out of index'
    angle *= (10 / 180) * math.pi  # 弧度

    xo = np.cos(angle)
    yo = np.sin(angle)

    y1 = row + height / 2 * yo
    x1 = col - height / 2 * xo
    y2 = row - height / 2 * yo
    x2 = col + height / 2 * xo

    return np.array(
        [
         [y1 - bottom/2 * xo, x1 - bottom/2 * yo],
         [y2 - bottom/2 * xo, x2 - bottom/2 * yo],
         [y2 + bottom/2 * xo, x2 + bottom/2 * yo],
         [y1 + bottom/2 * xo, x1 + bottom/2 * yo],
         ]
    ).astype(np.int)


if __name__ == '__main__':
    loc = rect_loc(200, 200, 0, 100, 40)
    print(loc)
    
# 结果
 >>> [[180 150]
	  [180 250]
 	  [220 250]
 	  [220 150]]
首先,可以使用 `cv2.rectangle()` 函数绘制矩形轮廓,并且该函数需要输入矩形的左上角和右下角顶坐标。如果已知矩形四个坐标,则可以计算出左上角和右下角顶坐标,然后调用 `cv2.rectangle()` 函数绘制矩形轮廓。 如果要根据矩形四个角点坐标得到矩形轮廓所有坐标,可以使用 NumPy 库的 `linspace()` 函数在两个顶之间生成一组等间隔的坐标值,然后根据这些坐标值生成矩形轮廓的所有坐标。具体步骤如下: 1. 计算矩形的左上角和右下角顶坐标: ```python x1, y1 = min(x_coords), min(y_coords) x2, y2 = max(x_coords), max(y_coords) ``` 其中 `x_coords` 和 `y_coords` 分别为四个角点的横坐标和纵坐标列表。 2. 生成横坐标和纵坐标的等间隔坐标值: ```python x_values = np.linspace(x1, x2, num=100, endpoint=True) y_values = np.linspace(y1, y2, num=100, endpoint=True) ``` 这里生成了 100 个等间隔的坐标值,可以根据实际情况调整 `num` 参数。 3. 生成矩形轮廓的所有坐标: ```python points = [(x, y) for x in x_values for y in y_values] ``` 这里使用了列表推导式和 `zip()` 函数生成所有坐标元组。 完整代码示例: ```python import cv2 import numpy as np # 四个角点坐标 points = [(100, 100), (300, 100), (300, 200), (100, 200)] # 提取横坐标和纵坐标列表 x_coords, y_coords = zip(*points) # 计算左上角和右下角顶坐标 x1, y1 = min(x_coords), min(y_coords) x2, y2 = max(x_coords), max(y_coords) # 生成横坐标和纵坐标的等间隔坐标值 x_values = np.linspace(x1, x2, num=100, endpoint=True) y_values = np.linspace(y1, y2, num=100, endpoint=True) # 生成矩形轮廓的所有坐标 points = [(x, y) for x in x_values for y in y_values] # 绘制矩形轮廓并显示 img = np.zeros((300, 400, 3), dtype=np.uint8) cv2.drawContours(img, [np.array(points)], 0, (0, 255, 0), 2) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值