Используя код из следующей ссылки https://devblogs.nvidia.com/opencv-optical-flow-algorithms-with-nvidia-turing-gpus/ Я попытался оценить оптический поток примера видео, используя приведенный ниже код.
import numpy as np
import cv2
def testing(vid_path):
cap = cv.VideoCapture(vid_path)
i = 0
frames = []
flow = []
size = None
while(cap.isOpened()):
success, frame = cap.read()
height, width, layers = frame.shape
size = (width,height)
if success:
frames.append(frame)
if i == 0:
i += 1
continue
else:
print(frames[i-1].shape, frames[i].shape)
nvof = cv.cuda_NvidiaOpticalFlow_1_0.create(frame.shape[1], frame.shape[0], 5, False, False, False, 0)
flow = nvof.calc(frames[i-1], frames[i], None)
flowUpSampled = nvof.upSampler(flow[0], frame.shape[1], frame.shape[0], nvof.getGridSize(), None)
flow.append(flowUpSampled)
i += 1
nvof.collectGarbage()
cap.release()
out = cv.VideoWriter('video.avi',cv.VideoWriter_fourcc(*'DIVX'), i, size)
for i in range(len(flow)):
out.write(flow[i])
out.release()
Функция тестирования имеет все функциональные возможности и берет путь видео, для которого должен был быть оценен оптический поток. Я хочу запустить его на моем графическом процессоре RTX 2070. Приведенный выше код выдает следующую ошибку -
(240, 320, 3) (240, 320, 3)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-14-13554636257c> in <module>
----> 1 testing('C:/Users/.../Downloads/TestingVid.mpg')
<ipython-input-13-207420f4d52a> in testing(vid_path)
17 print(frames[i-1].shape, frames[i].shape)
18 nvof = cv.cuda_NvidiaOpticalFlow_1_0.create(frame.shape[1], frame.shape[0], 5, False, False, False, 0)
---> 19 flow = nvof.calc(frames[i-1], frames[i], None)
20 flowUpSampled = nvof.upSampler(flow[0], frame.shape[1], frame.shape[0], nvof.getGridSize(), None)
21 flow.append(flowUpSampled)
error: OpenCV(4.3.0-dev) C:/Users/.../Downloads/opencv/opencv-master/modules/core/src/cuda/gpu_mat.cu:224: error: (-217:Gpu API call) invalid pitch argument in function 'cv::cuda::GpuMat::upload'
Я не понимаю ошибку правильно. Я пытался взглянуть на исходный код, но не смог найти причину этой ошибки. CUDA Toolkit version 10.2 Python 3.8 TIA.
Редактировать - Понимает ошибку. Нашел это. Мой GPU недостаточно большой, чтобы иметь значение шага для (240, 320, 3) кадра в памяти GPU, отсюда и эта ошибка. Как только я изменяю его на оттенки серого, ошибка исчезает.