Как найти ориентацию объекта (фигуры)? - Python Opencv - PullRequest
0 голосов
/ 30 октября 2019

Мои изображения всегда такие: Original images

Original images

Но мне нужно повернуть их, чтобы они были такими: rotated image rotated image

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

Я надеюсь, что кто-то может дать мне предложение, яЯ пробовал кучу разных стратегий, но пока безрезультатно.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вот один из способов в Python / OpenCV.

Read the image

Convert to grayscale

Threshold

Get outer contour

Get minAreaRect points and angle from outer contour

Get vertices of rotated rectangle

Draw the rotated rectangle

Correct the angle as needed

Print the angle

Save the image with the rotated rectangle drawn on it


Ввод:

enter image description here

import cv2
import numpy as np

# load image as HSV and select saturation
img = cv2.imread("wing2.png")
hh, ww, cc = img.shape

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold the grayscale image
ret, thresh = cv2.threshold(gray,0,255,0)

# find outer contour
cntrs = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

# get rotated rectangle from outer contour
rotrect = cv2.minAreaRect(cntrs[0])
box = cv2.boxPoints(rotrect)
box = np.int0(box)

# draw rotated rectangle on copy of img as result
result = img.copy()
cv2.drawContours(result,[box],0,(0,0,255),2)

# get angle from rotated rectangle
angle = rotrect[-1]

# from https://www.pyimagesearch.com/2017/02/20/text-skew-correction-opencv-python/
# the `cv2.minAreaRect` function returns values in the
# range [-90, 0); as the rectangle rotates clockwise the
# returned angle trends to 0 -- in this special case we
# need to add 90 degrees to the angle
if angle < -45:
    angle = -(90 + angle)

# otherwise, just take the inverse of the angle to make
# it positive
else:
    angle = -angle

print(angle,"deg")

# write result to disk
cv2.imwrite("wing2_rotrect.png", result)

cv2.imshow("THRESH", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()


Угол возврата: 0,8814040422439575 градус

Изображение с повернутым прямоугольником:

enter image description here

1 голос
/ 31 октября 2019

Вы должны вычислить основную ось (она основана на PCA). Это даст вам хорошее представление об основной ориентации, а затем вы сможете соответствующим образом повернуть изображение.

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

Вот полный алгоритм:

  • Вычислить основную ориентацию (главная ось, вычисленная с помощью PCA)
  • Повернуть изображение в соответствии с ориентацией главной оси.
  • Вычислить ограничивающий прямоугольник и центроид / барицентр
  • Если центроид находится слева, то ваше изображение хорошо ориентировано, иначе поверните его примерно на 180 °.

Вот результаты ... enter image description here enter image description here enter image description here enter image description here

...