构建代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
import time
import imutils
import math
def draw_box(point,circle,image_shape):
x1 = []
x2 = []
y1 = []
y2 = []
image_height,image_width = image_shape
if image_height > image_width:
campare_value = image_width / 2
for i in range(len(point)):
if circle[i] < image_width:
(x,y) = point[i]
x1.append(5)
x2.append(2*campare_value-5)
if (y - campare_value+5) < 0:
y1.append(5)
else:
y1.append(y - campare_value+5)
if (y + campare_value-5)> image_height:
y2.append(image_height-5)
else:
y2.append(y + campare_value-5)
else:
campare_value = image_height / 2
for i in range(len(point)):
if circle[i] < image_width:
(x,y) = point[i]
y1.append(5)
y2.append(2*campare_value-5)
if (x - campare_value+5) < 0:
x1.append(5)
else:
x1.append(x - campare_value+5)
if (x + campare_value-5)> image_width:
x2.append(image_width-5)
else:
x2.append(x + campare_value-5)
return x1,y1,x2,y2
def join_region(point_list,circle_list,image_shape):
image_height,image_width = image_shape
if image_height > image_width:
campare_value = image_width
point = []
circle = []
for i in range(len(point_list)):
number = 0
for j in range(i+1,len(point_list)):
distance = math.sqrt((point_list[i][0] - point_list[j][0]) ** 2 +(point_list[i][1] - point_list[j][1]) ** 2)
if distance < 0.4*campare_value:
number = number + 1
point.append(((point_list[i][0] + point_list[j][0])/2,(point_list[i][1] + point_list[j][1])/2))
circle.append(circle_list[i]+distance/2)
break
if number == 0:
point.append((point_list[i][0],point_list[i][1]))
circle.append(circle_list[i])
else:
campare_value = image_height
point = []
circle = []
for i in range(len(point_list)):
number = 0
for j in range(i+1,len(point_list)):
distance = math.sqrt((point_list[i][0] - point_list[j][0]) ** 2 +(point_list[i][1] - point_list[j][1]) ** 2)
if distance < 0.4*campare_value:
number = number + 1
point.append(((point_list[i][0] + point_list[j][0])/2,(point_list[i][1] + point_list[j][1])/2))
circle.append(circle_list[i]+distance/2)
break
if number == 0:
point.append((point_list[i][0],point_list[i][1]))
circle.append(circle_list[i])
return point,circle
执行代码
image = cv2.imread('5.png')
img_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
print(img_gray.shape)
# 寻找图像中的轮廓
contours, hierarchy = cv2.findContours(img_gray, 2, 1)
cnt_chosen = []
if len(contours) > 6:
number = 6
else:
number = len(contours)
for i in range(number):
if len(contours[i])>50:
cnt_chosen.append(contours[i])
point_list = []
circle_list = []
for j in range(len(cnt_chosen)):
(x, y), radius = cv2.minEnclosingCircle(cnt_chosen[j])
point_list.append((x, y))
circle_list.append(radius)
point,circle = join_region(point_list,circle_list,img_gray.shape)
x1,y1,x2,y2 = draw_box(point,circle,img_gray.shape)
for k in range(len(x1)):
left = int(x1[k])
right = int(x2[k])
up = int(y1[k])
bottom = int(y2[k])
print(left)
print(right)
print(up)
print(bottom)
cv2.rectangle(image, (left,up), (right,bottom), (0, 255, 0), 2)
plt.subplot(122)
plt.imshow(image,'gray') #展平图像数组并显
结果显示