2016-08-11 190 views
1

我在使用OpenCV 3.1.0录制视频时试图给帧添加时间戳。然而,在使用时VideoCapture ::得到(CV_CAP_PROP_POS_MSEC)来获得最后一帧的毫秒时间戳抓起返回的值始终为0。OpenCV VideoCapture :: get(CV_CAP_PROP_POS_MSEC)返回0

我正在使用的代码:

int fps = 10; 

VideoCapture cap(0); // open the default camera 

cap.set(CV_CAP_PROP_FPS, fps); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1024); 

if(!cap.isOpened()) // check if we succeeded 
    return -1; 

Mat testFrame; 
cap >> testFrame; 
cap >> testFrame; 
cap >> testFrame; 

Size outSize = Size(testFrame.cols, testFrame.rows); 

VideoWriter writer("video.avi", CV_FOURCC('M','J','P','G'), fps, outSize, true); 

for(; ;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 

    long stamp = cap.get(CV_CAP_PROP_POS_MSEC); // THIS DOESN'T SEEM TO WORK 

    std::cout << "Timestamp: " << stamp << std::endl; 

    writer.write(frame); 
} 

作为输出我总是得到许多行如下:

Timestamp: 0 

你能帮我明白我在做什么错吗?

谢谢:)

+0

不幸的是,并非每个摄像头都支持opencv VideoCapture的每个属性。 – Micka

回答

0

此bug已被固定在最近pull request。来自链接:

在cap_v4l.cpp文件中存在一个错误导致此问题。时间戳的值从第868行的缓冲区复制,但缓冲区中的数据无效,因为我们已经在第865行调用了VIDIOC_QBUF ioctl。解决方案是翻转代码的两行,因此我们读取调用VIDIOC_QBUF ioctl之前的时间戳。

相关问题