C++;摄像机模拟 目前我正在用OpenCV在C++中抓取相机图像,
当前的障碍是时钟问题 我想知道我应该如何使线程睡眠,使FPS正确 我目前的解决方案是使用纳米睡眠 这是FPS设置为50Hz时的代码C++;摄像机模拟 目前我正在用OpenCV在C++中抓取相机图像,,c++,opencv,timer,sleep,C++,Opencv,Timer,Sleep,当前的障碍是时钟问题 我想知道我应该如何使线程睡眠,使FPS正确 我目前的解决方案是使用纳米睡眠 这是FPS设置为50Hz时的代码 for(;;) { clock_t trueStart = clock(); cap >> frame; if( frame.empty() ) break; // end of video stream if( waitKey(10) == 27 ) break; // stop
for(;;)
{
clock_t trueStart = clock();
cap >> frame;
if( frame.empty() ) break; // end of video stream
if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC
uint8_t* pixelPtr = frame.data;
int cn = frame.channels();
// wait until the next frame becomes 1.
while (!data[currentFrame] == 0){
}
memcpy(data, pixelPtr, (size_t) frameByteSize);
data[currentFrame] = 0;
currentFrame = currentFrame % maximumFrames;
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
// for(int i = 0; i < frame.rows; i++)
// {
// for(int j = 0; j < frame.cols; j++)
// {
// data[0] = pixelPtr[i*frame.cols*cn + j*cn + 0]; // B
// data[1] = pixelPtr[i*frame.cols*cn + j*cn + 1]; // G
// data[2] = pixelPtr[i*frame.cols*cn + j*cn + 2]; // R
// // do something with BGR values...
// exit(0);
// }
// }
//videoWriter.write(frame);
double waitTime = 1.0 / frameRate - elapsed_secs;
int endwait;
endwait = clock() + waitTime * CLOCKS_PER_SEC ;
while (clock() < endwait){}
nanosleep((const struct timespec[]){{0, ((long) waitTime) * 1000000000L}}, NULL);
clock_t trueEnd = clock();
double elapsed = double(trueEnd - trueStart) / CLOCKS_PER_SEC;
cout << elapsed << endl;
begin = clock();
}
我想知道还有更好的方法吗?可以帮你。@Jesper Juhl谢谢!这能提供更高的准确度吗?这个答案可能有用:或者这个:你的相机没有提供一些设置固定帧速率的方法吗?(可能是通过设置
CV\u CAP\u PROP\u FPS
属性)(或者可能是我误解了您正在读取一个文件——该位丢失了,尽管标题暗示了这种可能性)。
0.022796
0.020024
0.020011
0.020034
0.020041
0.020024
0.023907
0.020443
0.020027
0.020019
0.020024
0.020011
0.020049
0.020011
0.020032
0.020022
0.020025
0.020097
0.022034