簡體   English   中英

使用注釋繪制視頻中對象的軌跡! [OpenCV]

[英]Draw trajectories of objects in a video using annotations! [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;
   }

我檢查了一下,如果條件成立,但視頻上沒有畫線。 我想我看不到線條,因為框架在變化,繪制的線條被新的框架清除了,但是我無法提出另一種方法。 謝謝你的幫助。

如果您想在每個框架上繪制注釋,並且您不介意在某些情況下信息可能已“過時”,我將執行以下操作:

  • 具有稱為“ overlay”的全局圖像變量,該變量將保存最新的注釋(關於當前幀號)表示,並且其大小與視頻流中的單個幀相同
  • 維護一個稱為“ last_object_annotation_idx”的索引數組,該數組將為每個對象存儲已經看到/使用過的其注釋的最后一個索引(每個對象最初設置為-1)
  • 在主循環的每次迭代中,更新“ last_object_annotation_idx”數組(即,對於每個對象,檢查當前幀號是否與下一個注釋的“ currFrame”字段匹配-我正在使用對注釋數組進行排序的信息)
  • 如果數組發生更改,請使用從“ last_object_annotation_idx”引用的注釋重新繪制覆蓋圖像
  • 最后,將疊加圖像添加到框架並顯示結果。

另外,在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;
}

“休息”不是一種錯誤嗎? 這意味着如果第一個檢查失敗,您將跳出循環,因此在這種情況下,您將看不到任何超出第一個索引的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM