# -*- coding : UTF-8 -*-
# @file : img_seg2line.py
# @Time : 2021/6/10 18:14
# @Author : wmz
# coding=utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
def draw_bbox(img_path, result, color=(255, 0, 0), thickness=8):
if isinstance(img_path, str):
img_path = cv2.imread(img_path)
# img_path = cv2.cvtColor(img_path, cv2.COLOR_BGR2RGB)
img_path = img_path.copy()
for point in result:
point = point.astype(int)
cv2.polylines(img_path, [point], True, color, thickness)
return img_path
def show_img(imgs: np.ndarray, title='img'):
color = (len(imgs.shape) == 3 and imgs.shape[-1] == 3)
imgs = np.expand_dims(imgs, axis=0)
for i, img in enumerate(imgs):
plt.figure()
plt.title('{}_{}'.format(title, i))
plt.imshow(img, cmap=None if color else 'gray')
plt.show()
def getFiles(path, suffix):
return [os.path.join(root, file) for root, dirs, files in os.walk(path) for file in files if file.endswith(suffix)]
if __name__ == '__main__':
# 读取输入图片
file_path = "./test/input"
dst_path = "./test/output"
img_filelist = getFiles(file_path, '.jpg')
for img_file in img_filelist:
# img_path = "./test/input/0001016.jpg"
img_path = img_file
img0 = cv2.imread(img_path)
rows, cols, c = img0.shape
print(rows, cols, c)
if rows > 800:
img = cv2.resize(img0, dsize=(0, 0), fx=0.125, fy=0.125, interpolation=cv2.INTER_NEAREST)
# 将彩色图片转换为灰度图片
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height, width = img.shape
dest_height, dest_width = rows, cols
# 创建一个LSD对象
# fld = cv2.ximgproc.createFastLineDetector()
# # 执行检测结果
# dlines = fld.detect(img)
# # 绘制检测结果
# # drawn_img = fld.drawSegments(img0,dlines, )
# for dline in dlines:
# x0 = int(round(dline[0][0]))
# y0 = int(round(dline[0][1]))
# x1 = int(round(dline[0][2]))
# y1 = int(round(dline[0][3]))
# cv2.line(img0, (x0, y0), (x1, y1), (0, 255, 0), 1, cv2.LINE_AA)
# 最小外接矩形
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
contours, _ = cv2.findContours(binary.astype(np.uint8), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
num_contours = len(contours)
boxes = np.zeros((num_contours, 4, 2), dtype=np.int16)
for index in range(num_contours):
contour = contours[index].squeeze(1)
bounding_box = cv2.minAreaRect(contour)
points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0])
index_1, index_2, index_3, index_4 = 0, 1, 2, 3
if points[1][1] > points[0][1]:
index_1 = 0
index_4 = 1
else:
index_1 = 1
index_4 = 0
if points[3][1] > points[2][1]:
index_2 = 2
index_3 = 3
else:
index_2 = 3
index_3 = 2
box = [points[index_1], points[index_2], points[index_3], points[index_4]]
box = list(list(x) for x in box)
box = np.array(box)
box[:, 0] = np.clip(np.round(box[:, 0] / width * dest_width), 0, dest_width)
box[:, 1] = np.clip(np.round(box[:, 1] / height * dest_height), 0, dest_height)
boxes[index, :, :] = box.astype(np.int16)
box = [box.astype(int)]
# print(box)
# img = draw_bbox(cv2.imread(img_path)[:, :, ::-1], boxes)
# show_img(img, title=os.path.basename(img_path))
# 显示并保存结果
# rect = cv2.minAreaRect(cnt)
# box = cv2.boxPoints(bounding_box)
# box = np.int0(box)
listbox = boxes.tolist()
length = len(listbox)
# array = np.array(listbox[0]).reshape(4, 1, 2)
listarraybox = []
for i in range(length):
array = np.array(listbox[i]).reshape(4, 1, 2)
listarraybox.append(array)
img0 = cv2.drawContours(img0, listarraybox, -1, (0, 0, 255), 2)
# cv2.imshow('drawimg', img0)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
dst_file = img_file.replace(file_path, dst_path)
dst_dir = dst_file.rsplit('\\', 1)[0]
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
cv2.imwrite(dst_file, img0)
# cv2.imshow("LSD", img0)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
python opencv画一张图的最小外接矩形(二)
最新推荐文章于 2023-12-19 13:04:21 发布