OpenCV: как отобразить повернутый угол в виде текста на изображении?

#python #python-3.x #opencv #matplotlib #opencv-python

#python #python-3.x #opencv #matplotlib #opencv-python

Вопрос:

Моя цель — создать изображение, которое включает повернутые углы в виде текста внутри каждой границы. Изображение должно включать цветные границы (которые я выяснил) и значение угла внутри каждой границы (которое я не выяснил).

КОД PYTHON

 import matplotlib.pyplot as plt
import cv2
import numpy as np
import csv


mask = cv2.imread('patch_mask.png')
mask = cv2.resize(mask, (400, 400))
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
ret2, th2 = cv2.threshold(mask_gray, 0, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)  # Otsu's 
method
image = cv2.imread('patch_image.png')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_enhanced = cv2.equalizeHist(image_gray)

# process image
boundary_output = "/Desktop/mat2py/mask_boundary.png"
ellipse_output = "/Desktop/mat2py/ellipse.png"
colormap_output = "/Desktop/mat2py/colormap.png"
# im = cv2.imread("patch_mask.png")
imgray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)

# find contours in the binary image
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(mask)
tmp2 = np.zeros_like(mask)
boundary = cv2.drawContours(tmp, contours, -1, (255, 255, 255), 1)

# calculate moments and extract cell shape info
moment_dict = {}
for index, cnt in enumerate(contours):
    moment_dict[index] = cv2.moments(cnt)

# creating a csv file named coordinates
with open('/Desktop/mat2py/coordinates.csv', 'w', newline='') as newFile:
    newFileWriter = csv.writer(newFile)
    newFileWriter.writerow(
        ["Center_x", "Center_y", "(Center_x, Center_y)", "(Major Axis, Minor Axis)", "Rotation Angle"])

obj_properties = {}
for index, obj_moments in moment_dict.items():
    cx, cy = obj_moments['m10'] / obj_moments['m00'], obj_moments['m01'] / obj_moments['m00']
    ellipse = (x, y), (MA, ma), angle = cv2.fitEllipse(contours[index])
    props = {'Center_x': cx, 'Center_y': cy, 'Major Axis': MA, 'Minor Axis': ma, 'Rotated Angle': angle}
    ellipse_image = cv2.ellipse(imgray, ellipse, (255, 0, 255))
    obj_properties[index] = props
    newFileWriter.writerow([cx, cy, (x, y), (MA, ma), angle])

all_the_angle = [v['Rotated Angle'] for k, v in obj_properties.items()]
min_angle = 0
max_angle = 180
range_angle = max_angle - min_angle

# color mapping of Rotated Angle scalars to BGR values
cmap = plt.cm.get_cmap('jet')
for index, prop in obj_properties.items():
    v = (prop['Rotated Angle'] - min_angle) / range_angle
    r, g, b, a = [int(x) for x in cmap(v, bytes=True)]
    color_input = (b, g, r)
    colormap_image = cv2.drawContours(image, contours, index, color_input, 2)

plt.imshow(colormap_image, cmap=cmap)
cbar = plt.colorbar()
cbar.ax.set_yticklabels([])  # vertically oriented colorbar
cbar.set_label('Angle (Degree)')
plt.show()

# save the boundary, ellipse, and colormap image
plt.imsave(boundary_output, boundary, cmap="gray")
cv2.imwrite(ellipse_output, ellipse_image)
colormap_image = plt.savefig(colormap_output)
# cv2.imwrite(colormap_output, colormap_image)
print("Saved contours, boundaries, ellipse and colormap as images and csv")
  

Это изображения, которые я использовал.
patch_image
patch_mask

Я получил это. patch_colormap

Как я могу показать повернутый угол на основе каждого контура? Например, внутри каждой границы я хочу добавить текст с ее повернутым углом.

Вот так: edited_patch_colormap

Комментарии:

1. Установите многоточия в каждую белую область вашей маски и получите угол главной оси из возвращаемых значений. Видишь docs.opencv.org/4.1.1/d3/dc0/… Существует несколько методов подгонки эллипсов.

2. Да, я сделал это, но я хотел бы показать углы в виде текста внутри изображения. @fmw42

3. Смотрите cv2.putText() в docs.opencv.org/4.1.1/d6/d6e /… и нарисуйте текст в центре эллипса.