EDIT: У меня возникли вопросы о том, что такое поток видео, поэтому я буду предлагать больше ясности. Поток представляет собой живой видеоролик из моей веб-камеры, доступ к которому осуществляется через OpenCV. Я получаю каждый кадр, когда камера читает его, и отправляю его в отдельный процесс для обработки. Процесс возвращает текст, основанный на вычислениях, выполненных на изображении. Затем текст отображается на изображении. Мне нужно отобразить поток в реальном времени, и это нормально, если есть разрыв между текстом и отображаемым видео (т.е. Если текст применим к предыдущему кадру, это нормально).
Возможно, более простой способ подумать об этом заключается в том, что я занимаюсь распознаванием образов на веб-камерах. Я посылаю один кадр за раз, чтобы выполнить отдельный процесс, чтобы провести анализ распознавания в кадре, и отправить текст обратно, чтобы он был помещен как подпись в прямом канале. Очевидно, что обработка занимает больше времени, чем просто захват кадров с веб-камеры и их отображение, поэтому, если есть задержка в том, что такое подпись и что показывает веб-камера, это приемлемо и ожидалось.
Что происходит сейчас, так это то, что живое видео, которое я показываю, отстает из-за других процессов (когда я не отправляю кадры в процесс для вычисления, нет отставания). Я также гарантировал, что за один раз выкладывается только один кадр, поэтому избегайте перегрузки очереди и вызывая задержку. Я обновил код ниже, чтобы отразить эту деталь.
Я использую модуль многопроцессорности в python, чтобы ускорить мою основную программу. Однако я считаю, что я мог бы делать что-то неправильно, поскольку я не думаю, что вычисления происходят довольно параллельно.
Я хочу, чтобы моя программа читала изображения из видеопотока в основном процессе и передавала кадры двум дочерним процессам, которые выполняют вычисления на них, и отправляет текст назад (содержащий результаты вычислений) в основной процесс,
Однако основной процесс, по-видимому, отстает, когда я использую многопроцессорную обработку, работаю примерно на половину быстрее, чем без нее, что заставляет меня думать, что процессы не работают полностью параллельно.
После некоторых исследований я предположил, что отставание, возможно, связано с передачей между процессами с использованием очереди (передача изображения с основного на ребенка и передача текста с дочернего на главный).
Однако я прокомментировал вычислительный шаг и просто обработал основной процесс изображением, а ребенок возвратил пустой текст, и в этом случае основной процесс вообще не замедлялся. Он работал на полной скорости.
Таким образом, я считаю, что либо
1) Я не оптимально использую многопроцессорность
ИЛИ
2) Эти процессы не могут быть реализованы параллельно (я бы понял небольшое отставание, но это замедляло основной процесс пополам).
Вот схема моего кода. Существует только один потребитель вместо 2, но оба потребителя почти идентичны. Если бы кто-нибудь мог предложить руководство, я был бы признателен.
class Consumer(multiprocessing.Process):
def __init__(self, task_queue, result_queue):
multiprocessing.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
#other initialization stuff
def run(self):
while True:
image = self.task_queue.get()
#Do computations on image
self.result_queue.put("text")
return
import cv2
tasks = multiprocessing.Queue()
results = multiprocessing.Queue()
consumer = Consumer(tasks,results)
consumer.start()
#Creating window and starting video capturer from camera
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
#Try to get the first frame
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
while rval:
if tasks.empty():
tasks.put(image)
else:
text = tasks.get()
#Add text to frame
cv2.putText(frame,text)
#Showing the frame with all the applied modifications
cv2.imshow("preview", frame)
#Getting next frame from camera
rval, frame = vc.read()