我有几个视频,每个约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条件是否为真,但视频上没有画线。我想我不会看到线条,因为帧正在变化,绘制的线条被新的帧清除,但我无法想出另一种方法。谢谢你的帮助。
答案 0 :(得分:0)
如果您想在每一帧上绘制注释,并且您不会介意这些信息可能已经过时&#34;过时&#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;有点不对?这意味着如果第一次检查失败,你将跳出循环,所以在这种情况下你不会看到超过第一个索引的任何东西。