Задать вопрос
Misha74rus
@Misha74rus

Как определить количество точек в каждом кубике?

Есть программа на python с open cv которая распознает кол.кругов на кубиках
но есть проблема, я не могу посчитать сколько кругов в каждом кубике, а только сумму итого. Как мне это сделать? формула, алгоритм или что то еще
import sys
import cv2 as cv
import numpy as np
from collections import Counter
from glob import glob
def main(argv):
    ## [load]
    default_file = 'opencv_frame_6.png'
    filename = argv[0] if len(argv) > 0 else default_file
    sum = 0
    # Loads an image
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    # Check if image is loaded fine
    if src is None:
        print ('Error opening image!')
        print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1
    ## [load]

    ## [convert_to_gray]
    # Convert it to gray
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ## [convert_to_gray]

    ## [reduce_noise]
    # Reduce the noise to avoid false circle detection
    gray = cv.medianBlur(gray, 5)
    ## [reduce_noise]

    ## [houghcircles]
    rows = gray.shape[0]
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 15,
                               param1=100, param2=28,
                               minRadius=59, maxRadius=130)
   

    circles1 = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 21,
                               param1=150, param2=28,
                               minRadius=1, maxRadius=50)## [houghcircles]

    ## [draw]

    if circles is not None:
        circles = np.uint16(np.around(circles)).astype("int")
        color_red = (0,0,255)
        for i in circles[0, :]:
            center = (i[0], i[1])
            
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center,radius,(255, 0, 255), 3)          

    if circles1 is not None:
        circles1 = np.uint16(np.around(circles1)).astype("int")
        color_red = (0,0,255)
        for i in circles1[0, :]:
            center = (i[0], i[1])
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)


    ## [draw]

    ## [display]

    
    cv.imshow("detected circles", src)
    print (circles)
    print (circles1)
    #print (len(circles[0]))
    #print (len(circles1[0]))

    cv.waitKey(0)

    ## [display]

    return 0


if __name__ == "__main__":
    main(sys.argv[1:])

5c4361efde9e0974495162.png
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
flapflapjack
@flapflapjack
на треть я прав
Я хоть и мало работал с opencv на питоне, один раз писал бота для игры с распознаванием монстров и иконок, но в вашем случае поступил бы так:

Детектировал бы квадраты, и считал бы количество центров кругов, которые принадлежат множеству точек квадратов.

Правда из-за того, что кубики пузатые - не знаю насколько точно получится детектировать квадраты.
Ответ написан
Комментировать
BitNeBolt
@BitNeBolt
Можно попробовать сделать область квадрата областью интереса.
В новых версия OpenCV это делается через срез в массиве точек картинке
Region_of_interes = img[y1:y2, x1:x2]
Выбрав наибольшие значения, можно работать с ними как с полноценными изображениями и поиск окружностей выполнить именно в этом регионе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы