C++ 使用Opencv/Gstreamer消除摄像机视频流中的延迟

C++ 使用Opencv/Gstreamer消除摄像机视频流中的延迟,c++,qt,opencv,camera,gstreamer,C++,Qt,Opencv,Camera,Gstreamer,我有一个摄像头应用程序,可以实时显示摄像头流: void MainWindow::on_start() { if(video.isOpened()) { video.release(); return; } if(!isCameraFound || !video.open(pipeline.trimmed().toStdString(), cv::CAP_GSTREAMER)) { QMessageBo

我有一个摄像头应用程序,可以实时显示摄像头流:

void MainWindow::on_start()
{

    if(video.isOpened())
    {

        video.release();
        return;
    }

    if(!isCameraFound || !video.open(pipeline.trimmed().toStdString(), cv::CAP_GSTREAMER))
    {
        QMessageBox::critical(this,
                                "Video Error",
                                "Must be the correct USB Camera connected!");
        return;
    }


    Mat frame;
    while(video.isOpened())
    {
        video >> frame;
        


        if(!frame.empty())
        {
            QImage qimg(frame.data,
                        frame.cols,
                        frame.rows,
                        frame.step,
                        QImage::Format_RGB888);
            pixmap.setPixmap( QPixmap::fromImage(qimg.rgbSwapped()) );
            ui->graphicsView->fitInView(&pixmap, Qt::KeepAspectRatio);
        }
...

我有一个处理功能,有一个循环来检查前250帧,因为当发现什么东西时,相机会发出一个特定的帧。但在进行循环时,视频流的延迟太大,基本上会冻结,直到循环完成。我如何才能消除帧捕获循环造成的延迟,从而能够通过该循环并使视频流不延迟

void MainWindow::on_push()
{
Mat test;

    for(int i = 0; i < 250; i++){

        video >> test; 
...

void主窗口::on_push()
{
垫试验;
对于(int i=0;i<250;i++){
视频>>测试;
...

因为您正在以相同的方式读取和处理视频thread@MuhammetAliAsan您认为哪种多线程方法最好?如果您进一步澄清,您想做什么我可以提供帮助。您将如何处理前250帧?视频是定期处理还是只对前几帧感兴趣?您将如何处理结果关于处理250帧?@MuhammetAliAsan我只是在分析帧的像素值,因为当摄像机发现某个物体时,它会显示一个特定的帧,该帧为700x700像素,其余为0。如果摄像机没有找到它,它会发送两个完全黑色的帧。通常在前25帧中会找到/没有找到0,这就是我选择该数字的原因。如果找不到该对象,我希望重新开始处理,然后再执行250帧,直到最后显示700x700帧。