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

Я пытаюсь обнаружить углы в изображении piechat, используя OpenCV. Я обнаруживаю линии, используя HoughlinesP, и пытаюсь найти углы между линиями, но он не показывает прямой угол, и если на круговой диаграмме есть прямая линия (например, 180 градусов), возникнет проблема.

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

Отредактировано Вот изображение в качестве образца:

PieChat

Это результат контуров

Любая помощь, любой путь, который вы указали, будет оценен по достоинству. Заранее спасибо.


person Uzair    schedule 08.02.2021    source источник
comment
Вы можете опубликовать изображение круговой диаграммы?   -  person Ian Chu    schedule 08.02.2021
comment
Пожалуйста, проверьте. Добавил картинки в пост.   -  person Uzair    schedule 08.02.2021


Ответы (1)


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

введите здесь описание изображения

Вывод, который я получаю:

[54.4, 18.3, 27.3]

[195.84, 65.88, 98.28]

import cv2
import numpy as np

# get pixel value under mouse
def clicky(event, x, y, flags, params):
    if event == cv2.EVENT_LBUTTONUP:
        global h;
        print(h[y][x]);

# load image
img = cv2.imread("pie.jfif");

# resize
scale = 0.5;
h, w = img.shape[:2];
h = int(h*scale);
w = int(w*scale);
img = cv2.resize(img, (w,h));

# hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV);
h,s,v = cv2.split(hsv);
h = cv2.medianBlur(h, 5);

# find values
cv2.namedWindow("Hue");
cv2.setMouseCallback("Hue", clicky);
while True:
    cv2.imshow("Hue", h);
    if cv2.waitKey(1) == ord('q'):
        break;

# threshold (102, 60, 14)
slices = [];
ranges = [102, 60, 14];
for r in ranges:
    mask = cv2.inRange(h, r-1, r+1);
    slices.append(np.sum(mask == 255));

# convert slices to percentages
percents = [];
total = sum(slices);
for s in slices:
    percent = (s / total) * 100;
    percents.append(round(percent, 1));
print(percents);

# convert to angles
angles = [];
total = 360;
for p in percents:
    angles.append(p * total / 100);
print(angles);

Нажмите «q» на изображении, чтобы пройти мимо раздела кода, посвященного поиску цвета.

person Ian Chu    schedule 08.02.2021
comment
ты спасаешь мой день. Спасибо - person Uzair; 09.02.2021
comment
Есть ли способ автоматически получить это событие щелчка внутри определенной области?? иногда я получаю нулевое значение.. - person Uzair; 11.04.2021