opencv 将所有视频一起显示

Posted

技术标签:

【中文标题】opencv 将所有视频一起显示【英文标题】:opencv display all videos together 【发布时间】:2017-06-10 18:37:27 【问题描述】:

我正在编写一个 openCV 简单程序以单帧显示多视频。

我可以写两个视频,我想要 4 个视频,可以有人指导如何在单帧中显示 4 个视频。 下面是我的代码

 int main(int argc, char** argv)
 
   string filename = "/home/user/testavicaravi.avi";
   VideoCapture capture(filename);

   VideoCapture capture1(filename);



   Mat frame;

   Mat frame1;


   if( !capture.isOpened() )
        throw "Error when reading steam_avi0";
   if( !capture1.isOpened() )
        throw "Error when reading steam_avi1";


   namedWindow( "w", 1);

   for( ; ; )
   
       capture >> frame;
       capture1 >> frame1;

       if(frame.empty())
            break;

       if(frame1.empty())
           break;

       Mat canvas = Mat::zeros(frame.rows*2+1, frame.cols*2+1, frame.type());


       frame.copyTo(canvas(Range::all(), Range(0, frame.cols)));


       frame1.copyTo(canvas(Range::all(), Range(frame1.cols+1, frame1.cols*2+1)));
       // if it is too big to fit on the screen, then scale it down by 2, hopefully it'll fit :-)
       imshow("w", canvas);
   
   waitKey(0); // key press to close window
   // releases and window destroy are automatic in C++ interface
 

【问题讨论】:

不同的主题,但您需要在循环中使用 waitKey(1)! 【参考方案1】:

您正在解决这个问题的正确轨道上。 根据您希望如何显示 4 个视频(作为 2x2、1x4、4x1 矩阵),试试这个:

frame1, frame2, frame3, frame4 are frames read from cameras 1, 2, 3 and 4
For 1x4: canvas size = 
  cols = frame1.cols + frame2.cols + frame3.cols + frame4.cols
  rows = max(frame1.rows, frame2.rows, frame3.rows, frame4.rows)
  frame1.copyTo(canvas(Rect(Point(0,0), frame1.size())))
  frame2.copyTo(canvas(Rect(Point(frame1.cols,0), frame2.size())))
  frame3.copyTo(canvas(Rect(Point(frame2.cols,0), frame3.size())))
  frame4.copyTo(canvas(Rect(Point(frame3.cols,0), frame3.size())))

For 4x1: canvas size = 
  cols = max(frame1.cols, frame2.cols, frame3.cols, frame4.cols)
  rows = frame1.rows + frame2.rows + frame3.rows + frame4.rows)
  frame1.copyTo(canvas(Rect(Point(0,0), frame1.size())))
  frame2.copyTo(canvas(Rect(Point(0,frame1.rows), frame2.size())))
  frame3.copyTo(canvas(Rect(Point(0,frame2.rows), frame3.size())))
  frame4.copyTo(canvas(Rect(Point(0,frame3.rows), frame4.size())))

For 2x2: canvas size = 
  cols = max(frame1.cols, frame2.cols) + max(frame3.cols, frame4.cols)
  rows = max(frame1.rows, frame2.rows) + max(frame3.rows, frame4.rows)
  frame1.copyTo(canvas(Rect(Point(0,0), frame1.size())))
  frame2.copyTo(canvas(Rect(Point(frame1.cols,0), frame1.size())))
  frame3.copyTo(canvas(Rect(Point(0,max(frame1.rows, frame2.rows)), frame3.size())))
  frame4.copyTo(canvas(Rect(Point(frame3.cols,max(frame1.rows, frame2.rows)), frame4.size())))

不过,您可能需要考虑调整这些框架的大小,然后再将它们组合到一个大画布中,这样它们就可以全部放在一个屏幕中

【讨论】:

如何在 360 度视图中去扭曲相同的视频?是否可以在 openCV 中进行反扭曲 @indra:你应该把它作为一个关于 SO 的新问题发布。另外,如果答案对您有用,请将答案标记为“已接受”

以上是关于opencv 将所有视频一起显示的主要内容,如果未能解决你的问题,请参考以下文章

opencv将视频显示为凹面图像

二.使用 OpenCV 读写视频

opencv将视频canny后显示播放一卡一卡的,是否需要的canny时间太长了,怎么解决

是否可以在 IPython /JuPyter Notebook 中显示 OpenCV 视频?

使用 OpenCV 和 PyAudio 同步音频和视频

Qt + OpenCV 使用 std::thread 播放视频