![](/img/trans.png)
[英]Make video capture to be grayscale and draw rectangle in it using 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;
}
我檢查了一下,如果條件成立,但視頻上沒有畫線。 我想我看不到線條,因為框架在變化,繪制的線條被新的框架清除了,但是我無法提出另一種方法。 謝謝你的幫助。
如果您想在每個框架上繪制注釋,並且您不介意在某些情況下信息可能已“過時”,我將執行以下操作:
另外,在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.