Ask Your Question

Python cv2.VideoCapture from subprocess.PIPE?

asked 2014-02-20 20:37:44 -0500

SergeiF gravatar image

Hi, I am trying to capture video from a subprocess (which outputs stream to stdout).



videopipe = subprocess.Popen(externalcmd, stdout=subprocess.PIPE)
capture = cv2.VideoCapture(videopipe.stdout)

Obviously snippet from above does not work.... Where the external command will be generating raw video stream...

How does captures video from a pipe with python cv2?

Thanks a lot!


edit retag flag offensive close merge delete


VideoCapture wants either a string(a filename or url) or a number (cam-id) as input.

what did you try to achieve with your pipe ?

berak gravatar imageberak ( 2014-02-21 01:38:43 -0500 )edit

I want to capture from an external process, so the external process handles the source (codec/format) and converts it into rawvideo format. The idea is that for example avconv can handle reliably all video cams, as I have problems with cv2.VideoCapture an rtsp stream reliably (there are a lot of h264 errors). I am attempting in using named pipe as input for VideoCapture (at this stage without success). Ideally it would be nice to do this: someprocess |, where someprocess provides a rawvideo stream and does OpenCV stuff regardless what is the source of video (motion detection, face detection etc.).

SergeiF gravatar imageSergeiF ( 2014-02-23 14:55:50 -0500 )edit

Oh, it is for linux.

SergeiF gravatar imageSergeiF ( 2014-02-23 14:57:40 -0500 )edit

2 answers

Sort by ยป oldest newest most voted

answered 2014-07-29 03:08:13 -0500

nicosmik gravatar image

I found a way to pipe a stream to VideoCapture for windows, because openCV is based on FFmpeg, that supports named pipe.

Here is a quick example:

#!/usr/bin/env python
import cv2
import win32pipe, win32file
from threading import Thread

def runPipe():    
        p = win32pipe.CreateNamedPipe(r'\\.\pipe\myNamedPipe',
                                        win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
                                        1, 1024, 1024, 0, None)        
        win32pipe.ConnectNamedPipe(p, None)    
        with open("D:\\Streams\\mystream.ts", 'rb') as input:
            while True:
                data =
                if not data:
                win32file.WriteFile(p, data)                

def extract():
    cap = cv2.VideoCapture(r'\\.\pipe\myNamedPipe')    
    fnum = 0
        # Capture frame-by-frame
        ret, frame =                                                                             
        print fnum, "pts:", cap.get(
        fnum = fnum + 1                
    # When everything done, release the capture

if __name__ == "__main__":    
    thr = Thread(target=extract)
    print "bye"
edit flag offensive delete link more


oh, nice. will be helpful to some people !

berak gravatar imageberak ( 2014-07-29 04:33:02 -0500 )edit

answered 2014-07-24 04:48:28 -0500

nicosmik gravatar image

updated 2014-07-24 04:49:24 -0500


I would like to do exactly the same under windows.

Do you know if it is possible to pipe a video stream to cv2.VideoCapture?

Thanks, Nicolas.

edit flag offensive delete link more


no, not supported.

also i don't understand what you'd need the VideoCapture for.

if it's decoded image pixels, why not read it into a numpy array from pyhon straight away ?

berak gravatar imageberak ( 2014-07-24 06:20:47 -0500 )edit

The goal is to pipe a compressed video stream (like MP4 or Mpeg2TS) to cv2.VideoCapture. You propose another way to do it?

nicosmik gravatar imagenicosmik ( 2014-07-24 07:16:11 -0500 )edit

oh i see. got you wrong there, sorry.

can't you redirect the pipe to a socket ? some dirty netcat trick ? then connect the VideoCapture to your localhost.

berak gravatar imageberak ( 2014-07-24 07:25:41 -0500 )edit

Question Tools


Asked: 2014-02-20 20:37:44 -0500

Seen: 4,213 times

Last updated: Jul 29 '14