Как увеличить скорость воспроизведения видео в Python с помощью openCV - PullRequest
5 голосов
/ 14 марта 2019

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

enter image description here Снимок экрана для справки о том, как выглядит видео.Во время видео камера приближается, но из-за медленной скорости мне приходится ждать несколько минут, чтобы увидеть изменения, но когда происходила съемка, она перемещалась каждые несколько секунд.

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

Какое решение я мог бы реализовать, чтобы ускорить мою программу?

import cv2

cap = cv2.VideoCapture('video.mp4')

while(cap.isOpened()):

    ret, frame = cap.read()
    canny = cv2.Canny(frame, 85, 255)
    height, width = canny.shape

    first_black_array = []

    for x in range(width):
        first_black_pixel_found = 0
        for y in range(height):
            if first_black_pixel_found == 0:
                if canny[y,x] == 255:
                    first_black_array.append(height - y)
                    first_black_pixel_found = 1
                    cv2.line(frame,(x,y),(x,y),(0,255,0),1)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Потенциальное дальнейшее улучшение может заключаться в размещении операции захвата кадра в отдельном потоке.Поскольку cv2.VideoCapture().read() является операцией блокировки, ваша программа испытывает задержку ввода-вывода при опросе нового кадра.В настоящее время основной поток опрашивает фрейм, а затем обрабатывает его в последовательном порядке .Выделив совершенно другой поток только для опроса кадров и сфокусировав основной поток только на обработке кадров, вы можете выполнить свою задачу в параллельно .

1 голос
/ 14 марта 2019

Это проблема ...

for x in range(width):
    for y in range(height):
         if canny[y,x] == 255:

Numpy.argmax является решением ...

for x in range(width-1):
    # Slice the relevant column from the image
    # The image 'column' is a tall skinny image, only 1px thick
    column = np.array(canny[:,x:x+1])
    # Use numpy to find the first non-zero value
    railPoint = np.argmax(column)

Полный код:

import cv2, numpy as np, time
# Get start time
start = time.time()
# Read in the image
img = cv2.imread('/home/stephen/Desktop/rail.jpg')[40:,10:-10]
# Canny filter
canny = cv2.Canny(img, 85, 255)
# Get height and width
height, width = canny.shape
# Create list to store rail points
railPoints = []
# Iterate though each column in the image
for position in range(width-1):
    # Slice the relevant column from the image
    # The image 'column' is a tall skinny image, only 1px thick
    column = np.array(canny[:,position:position+1])
    # Use numpy to find the first non-zero value
    railPoint = np.argmax(column)
    # Add the railPoint to the list of rail points
    railPoints.append(railPoint)
    # Draw a circle on the image
    cv2.circle(img, (position, railPoint), 1, (123,234,123), 2)
cv2.imshow('img', img)                      
k = cv2.waitKey(1)
cv2.destroyAllWindows()
print(time.time() - start)

МойРешение с использованием Numpy заняло 6 мс, а ваше решение заняло 266 мс.rail output

...