обнаружение шара в питоне идет очень медленно, какие-либо советы по его предотвращению? - PullRequest
0 голосов
/ 24 марта 2019

Я работаю над датчиком для ПИД-регулятора, поэтому в основном у меня есть камера, записывающая сцену. Чтобы управление работало, мне нужно выделить положение теннисного мяча на сцене в каждом кадре. Сцена с белым фоном и оранжевым теннисным мячом, как вы можете видеть на картинке: enter image description here

И когда я запускаю его на своем Lenovo IdeaPad 100 (это довольно медленный компьютер), я получаю положение мяча, скажем, 1,2 секунды. Я думаю, что это можно сделать намного быстрее, но я не знаю, что делать. Любые советы и предложения приветствуются.

Я ожидаю систему, которая может генерировать как минимум 2 позиции каждую секунду

Вот мой код:

import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
lower_red = np.array([0,100,100])
upper_red = np.array([20,255,255])

while(1): 
    start = time.time()
    # Load an color image in grayscale

    _,img = cap.read()
    print("read")
    #get the image's width and height
    blurred = cv2.GaussianBlur(img, (11, 11), 0)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    hsv2 = cv2.cvtColor(blurred,cv2.COLOR_BGR2HSV)

    mask2 = cv2.inRange(hsv2, lower_red, upper_red)
    mask2 = cv2.erode(mask2, None, iterations=2)
    mask2 = cv2.dilate(mask2, None, iterations=2)

    imageWidth = mask2.shape[1]
    imageHeight = mask2.shape[0]

    sum_i_white = 1
    num_white = 1
    sum_j_white = 1
    for i in range(0,imageHeight):
        for j in range(0,imageWidth):
            if mask2[i][j] == 255:
                sum_i_white += i
                sum_j_white += j
                num_white += 1

    cv2.circle(img,(int(sum_j_white/num_white),int(sum_i_white/num_white)),3,(0,0,255), -1)
    cv2.putText(img,'here',(int(sum_j_white/num_white),int(sum_i_white/num_white)), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 1, cv2.LINE_AA)
    cv2.imshow("final",img)
    print(time.time()-start)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 24 марта 2019

Вы знаете, что медленно? Я знаю, что вы можете запустить программу на C с Python. Таким образом, если ваш double for очень медленный, вы можете создать программу на C, выполняющую это. Если у вас есть массив массива и int как входные данные, и int как выходные данные, я думаю, что это не должно быть сложно. Но я не знаю, будет ли это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...