使用注释绘制视频中对象的轨迹! [OpenCV的]

时间:2014-04-06 02:34:59

标签: c++ qt opencv

我有几个视频,每个约5分钟,还有注释数据,其中包含每个帧编号的每个对象边界框坐标的信息。 我正在尝试读取视频并逐帧绘制边界框中心之间的线条(当前帧编号与地面实况数据中的数字匹配时)。我不想在批处理过程中这样做,但每30或60帧对我有用。 这是我的代码:

VideoCapture capture(path_video);
if (!capture.isOpened()){
   cout <<  "Failed to capture frame/Open the file" << "\n";
   return 0;
}
bool stop(false);
while(!stop){
   capture >> frame;
   if (frame.data==NULL) {
      break;
   }
   double rate = capture.get(CV_CAP_PROP_FPS);
   int delay = 1000/rate;
   frmNum = (capture.get(CV_CAP_PROP_POS_FRAMES));
   for (int i=0 ; i<db.size() ; i++){//db is a vector of vector that has annotation data for each object splited in inner vectors , and is sorted ascendingly on start frame number of objects.
      if (!db[i].empty()){
         for (int j=1 ; j<db[i].size() ; j++){
            if(frmNum == db[i][j-1].currFrame){
               cv::line(frame, db[i][j-1].pnt, db[i][j].pnt,Scalar(255,0,0),2);
            }
            else{
               break;
            }
         }
      }
   }
   imshow("Video", frame);
   int key = waitKey(delay);
   if (key==27){
      break;
   }

我检查了我的if条件是否为真,但视频上没有画线。我想我不会看到线条,因为帧正在变化,绘制的线条被新的帧清除,但我无法想出另一种方法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

如果您想在每一帧上绘制注释,并且您不会介意这些信息可能已经过时&#34;过时&#34;在某些情况下,我会做以下事情:

  • 有一个名为&#34; overlay&#34;的全局图像变量它将保持最新的(关于当前帧号)注释的表示形式,并且与视频流中的单个帧具有相同的大小
  • 维护一个名为&#34; last_object_annotation_idx&#34;的索引数组,它将为每个对象存储已经看到/使用过的注释的最后一个索引(最初为每个对象设置为-1)
  • 在主循环的每次迭代中,更新&#34; last_object_annotation_idx&#34;数组(也就是说,对于每个对象检查当前帧编号是否与下一个注释的&#34; currFrame&#34;字段匹配 - 我正在使用注释数组的信息排序)
  • 如果对数组进行了更改,请使用引自&#34; last_object_annotation_idx&#34;
  • 的注释重绘覆盖图像
  • 最后,将叠加图像添加到框架并显示结果。

另外,在if语句中

if(frmNum == db[i][j-1].currFrame){
    cv::line(frame, db[i][j-1].pnt, db[i][j].pnt,Scalar(255,0,0),2);
}
else{
    break;
}

不是&#34;休息&#34;有点不对?这意味着如果第一次检查失败,你将跳出循环,所以在这种情况下你不会看到超过第一个索引的任何东西。