left_point_x = np.min(box[:, 0]) right_point_x = np.max(box[:, 0]) top_point_y = np.min(box[:, 1]) bottom_point_y = np.max(box[:, 1]) 如何绘制出轮廓
时间: 2024-03-09 19:50:28 浏览: 125
要绘制出轮廓,可以使用cv2.rectangle函数,该函数需要传入轮廓的左上角和右下角坐标,即left_point_x、top_point_y和right_point_x、bottom_point_y,以及矩形框的颜色和线宽等参数。例如,可以使用以下代码绘制出矩形轮廓:
```
cv2.rectangle(image, (left_point_x, top_point_y), (right_point_x, bottom_point_y), (0, 255, 0), 2)
```
其中,image是需要绘制轮廓的图像,(0, 255, 0)是矩形框的颜色,2是线宽。
相关问题
python opencv 帮我写一份代码 ,要求如下 假设img_test经过滤波后进行轮廓提取 假设提取后有有rect = cv2.minAreaRect(contour)、box = cv2.boxPoints(rect)、box = np.round(box).astype('int64') 通过box 有矩形A:left_point_x = np.min(box[:, 0])、right_point_x = np.max(box[:, 0])、top_point_y = np.min(box[:, 1])、bottom_point_y = np.max(box[:, 1]) 假设有点(x1、y1) 判断 x1是否在right_point_x与left_point_x之内 若不在 则将x1平移到离矩形A最近的一条边上 同理 判断y1是否在top_point_y与bottom_point_y之内 若不在 则将y1平移到x1平移之后所在的边上
好的,以下是 Python OpenCV 代码实现:
```python
import cv2
import numpy as np
# 假设img_test经过滤波后进行轮廓提取,contour为轮廓
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.round(box).astype('int64')
# 获取矩形的四个顶点坐标
left_point_x = np.min(box[:, 0])
right_point_x = np.max(box[:, 0])
top_point_y = np.min(box[:, 1])
bottom_point_y = np.max(box[:, 1])
# 假设有点(x1, y1)
x1 = 50
y1 = 100
# 判断x1是否在right_point_x与left_point_x之内
if x1 < left_point_x or x1 > right_point_x:
# 将x1平移到离矩形A最近的一条边上
if x1 < left_point_x:
x1 = left_point_x
else:
x1 = right_point_x
# 判断y1是否在top_point_y与bottom_point_y之内
if y1 < top_point_y or y1 > bottom_point_y:
# 将y1平移到x1平移之后所在的边上
if y1 < top_point_y:
y1 = top_point_y
else:
y1 = bottom_point_y - (bottom_point_y - y1)
# 打印结果
print("平移后的点坐标为:", x1, y1)
```
其中,示例中的点坐标是随便设定的,实际应用中需要根据实际情况获取。
解释def adaPoint(box, pro): box_pro = box if pro != 1.0: box_pro = box / pro box_pro = np.trunc(box_pro) return box_pro # 四边形顶点排序,[top-left, top-right, bottom-right, bottom-left] def orderPoints(pts): rect = np.zeros((4, 2), dtype="float32") s = pts.sum(axis=1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] diff = np.diff(pts, axis=1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] return rect # 计算长宽 def pointDistance(a, b): return int(np.sqrt(np.sum(np.square(a - b)))) # 透视变换 def warpImage(image, box): w, h = pointDistance(box[0], box[1]), pointDistance(box[1], box[2]) dst_rect = np.array([[0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1]], dtype='float32') M = cv2.getPerspectiveTransform(box, dst_rect) warped = cv2.warpPerspective(image, M, (w, h)) return warped
这是一个用于透视变换的函数,主要包括以下几个步骤:
1. adaPoint函数:根据给定的比例pro,将四边形的顶点坐标进行适当的缩放,并将坐标转换为整数类型;
2. orderPoints函数:对四边形的顶点进行排序,使其按照[top-left, top-right, bottom-right, bottom-left]的顺序排列;
3. pointDistance函数:计算两个点之间的欧氏距离;
4. warpImage函数:通过透视变换将原始图像image转换为目标四边形box所确定的矩形区域内的图像。具体实现方法是:
(a) 计算目标矩形的宽w和高h,以及目标矩形的四个顶点坐标dst_rect;
(b) 使用cv2.getPerspectiveTransform函数计算从原始四边形box到目标矩形dst_rect的透视变换矩阵M;
(c) 使用cv2.warpPerspective函数对原始图像image进行透视变换,得到目标矩形内的图像warped。
透视变换常用于图像校正、文档扫描等领域。
阅读全文