📅  最后修改于: 2023-12-03 15:10:45.992000             🧑  作者: Mango
本程序用于查找输入图像中所有直角三角形或其对应的矩形的区域,并返回其在图像中的坐标、大小和角度等信息。
本程序接受一张图片作为输入。
本程序输出一个列表,列表中每个元素表示一个直角三角形或其对应的矩形的区域。
每个元素包含以下属性:
x
: 区域左上角点的横坐标。y
: 区域左上角点的纵坐标。width
: 区域的宽度。height
: 区域的高度。angle
: 区域所在的角度(与水平方向的夹角)。import cv2
import numpy as np
def find_rectangles(img):
# 预处理图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
edges = cv2.Canny(blur, 50, 150, apertureSize=3)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100)
rectangles = []
for line in lines:
x1, y1, x2, y2 = line[0]
if abs(x2 - x1) + abs(y2 - y1) < 50: # 排除过短的直线
continue
angle = np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi
if abs(angle) < 10 or abs(angle) > 170: # 排除非垂直和非水平的直线
continue
if abs(angle) < 80: # 直角三角形
if angle < 0:
x,y,w,h = x1,y2,x2-x1,y1-y2
else:
x,y,w,h = x1,y1,x2-x1,y2-y1
rectangles.append({'x': x, 'y': y, 'width': w, 'height': h, 'angle': angle})
else: # 直角矩形
x,y,w,h = min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1)
rectangles.append({'x': x, 'y': y, 'width': w, 'height': h, 'angle': angle})
return rectangles
# 示例
img = cv2.imread('test.jpg')
rectangles = find_rectangles(img)
print(rectangles)
本程序使用了OpenCV库和NumPy库,流程如下: