Sebastian Schmitz
Sebastian Schmitz

Reputation: 1894

OpenCV: Should the write from VideoWriter run in an independent thread?

I'm writing a program that reads multiple webcams, stitches the pictures together and saves them into a video file.

  1. Should i use threads to capture the images and to write the resulting large image into a file?
  2. If yes, should i use c+11 or boost?
  3. Do you maybe have some simple example code which shows how to avoid racing conditions?

I already found this thread which uses threads for write but it doesn't seem to avoid racing conditions.

pseudocode of my program:

camVector //vector with cameras
VideoWriter outputVideo //outputs the video

while(true){
    for(camera:camVector){
        camera.grab() //send signal to grab picture
    }
    picVector = getFrames(camVector) //collect frames of all cameras into a Vector

    Mat bigImg = stitchPicTogether(picVector)

    outputVideo.write(bigImg)
}

Upvotes: 1

Views: 1796

Answers (1)

Antoine
Antoine

Reputation: 14094

That's what I'd do:

camVector //vector with cameras
VideoWriter outputVideo //outputs the video

for(camera:camVector) camera.grab(); // request first frame

while(true){
    parallel for(camera:camVector) {
        frame = getFrame(camera);
        pasteFrame(/* destination */ bigImg,
                   /* geometry    */ geometry[camera],
                   /* source      */ frame
                  );
        camera.grab(); // request next frame, so the webcam driver can start working
                       // while you write to disk
    }
    outputVideo.write(bigImg)
}

This way stiching is done in parallel, and if your webcam drivers have different timing, you can begin stiching what you recieved from one webcam while you wait for the other webcam's frame.

About implementation, you could simply go with OpenMP, already used in OpenCV, something like #pragma omp parallel. If you prefer something more C++ like, give Intel TBB a try, it's cool.

Or as you said, you could go with native C++11 threads or boost. Choosing between the two mainly depend on your work environment: if you intend to work with older compiler, boost is safer.

In all cases, no locking is required, except a join at the end, to wait for all threads to finish their work.

If your bottleneck is writing the output, the limitting factor is either disk IO or video compression speed. For disk, you can try changing codec and/or compressing more. For compression speed, have a look at GPU codecs like this.

Upvotes: 1

Related Questions