C++;摄像机模拟 目前我正在用OpenCV在C++中抓取相机图像,

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

当前的障碍是时钟问题

我想知道我应该如何使线程睡眠,使FPS正确

我目前的解决方案是使用纳米睡眠

这是FPS设置为50Hz时的代码

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