Как одновременно анализировать и транслировать видео RaspberryPi - PullRequest
1 голос
/ 24 января 2020

Я передаю видео с RaspberryPi Zero на мой P C с помощью raspivid и netcat:

raspivid -t 0 -n -w 320 -h 240 -hf -fps 30 -o - | nc PC_IP PORT

Теперь я хочу проанализировать это видео на RaspberryPi кадр за кадром, чтобы выполнить обнаружение объекта. Raspi должен реагировать на обнаружение объекта, поэтому я должен выполнить анализ Pi, пока я транслирую видео.

Моя идея состояла в том, чтобы создать именованный канал с помощью команды tee и прочитать этот именованный канал. в программе python для получения кадров:

mkfifo streampipe    
raspivid -t 0 -n -w 320 -h 240 -hf -fps 30-o - | tee nc PC_IP PORT | streampipe

Но это не работает, говорит sh1: 1: streampipe: not found

Моя python программа выглядит следующим образом:

import subprocess as sp
import numpy

FFMPEG_BIN = "ffmpeg"
command = [ FFMPEG_BIN,
        '-i', 'streampipe',       # streampipe is the named pipe
        '-pix_fmt', 'bgr24',      
        '-vcodec', 'rawvideo',
        '-an','-sn',              # we want to disable audio processing (there is no audio)
        '-f', 'image2pipe', '-']    
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)

while True:
    # Capture frame-by-frame
    raw_image = pipe.stdout.read(640*480*3)
    # transform the byte read into a numpy array
    image =  numpy.fromstring(raw_image, dtype='uint8')
    image = image.reshape((480,640,3))          # Notice how height is specified first and then width
    if image is not None:

        analyse(image)...

    pipe.stdout.flush()

У кого-нибудь есть идеи, как это сделать?

Спасибо за ваши ответы.

1 Ответ

1 голос
/ 27 января 2020

Команда tee копирует stdin в stdout и, по пути, в любые другие файлы, которые вы упоминаете:

ProcessThatWriteSTDOUT | tee SOMEFILE | ProcessThatReadsSTDIN

или делает две копии:

ProcessThatWriteSTDOUT | tee FILE1 FILE2 | ProcessThatReadsSTDIN

Ваша nectcat команда - это не файл, а процесс. Таким образом, вам нужно, чтобы ваш процесс выглядел как файл - и это называется "подстановка процесса" Вы делаете это так:

ProcessThatWriteSTDOUT | tee >(SomeProcess) | ProcessThatReadsSTDIN

Итак, чтобы сократить длительную историю, вам нужно что-то вроде:

raspivid ... -fps 30-o - | tee >(nc PC_IP PORT) | streampipe
...