双摄同步问题,利用opencv的capture.grab() 抓取运动物体图片,两摄像头总会出现一块一慢的情况。

程序采用C++编写,程序大致流程为,打开两摄像头采集,在接收到串口的指令
之后,用capture.grab()抓取1号摄像头的帧,紧接着抓取2号摄像头的帧。
大致代码如下:

            VideoCapture capture(1);
            VideoCapture capture1(2);

            while(1)
            {
                if(serial_command)
                {
                    capture.grab();//程序调试此时间在20us以内
                    capture1.grab();//程序调试此时间在20us以内
                    capture.retrieve(pic1);
                    capture1.retrieve(apic1);
                    //之后是进行图像处理。
                }
                //清除串口标志位
                cv::waitKey(1);//等待1ms
            }


两摄像头相同型号,都是120帧的摄像头。但是采集出来的图像会出现以下三种。还有一种是右边更高的。没有图。
图片说明
图片说明

对了,拍摄的物体是运动的(匀速),速度大概在0.5m/s。每次要不就是同帧(图片偏差很小),要不就是后面抓取的摄像头会偏慢(黑边伸出的较多),还有就是先抓取的摄像头会偏慢。

请教下大家,这是什么问题,是摄像头的问题还是程序上面有问题。理论上来说我抓取时间间隔基本上就差个几十微妙。几乎可以说是同步了。但是拍出来的图片,还是会出现前后差一帧的现象,并且此现象不是规律性出现。

不清楚具体原因是啥,程序改成这样就可以了。

            VideoCapture capture(1);
            VideoCapture capture1(2);

            while(1)
            {
                capture.grab();//程序调试此时间在20us以内
                capture1.grab();//程序调试此时间在20us以内
                if(serial_command)
                {
                    capture.retrieve(pic1);
                    capture1.retrieve(apic1);
                    //之后是进行图像处理。
                }
                //清除串口标志位
                cv::waitKey(1);//等待1ms
            }

改成这样的思路是因为:我之前连续采集10多帧,发现采集的图像的间隔固定,说明中间每帧的时间都是固定的。并且没有出现丢帧的现象。
所以,就把抓取放在while(1)中,如果没有进入指令的话,就只有1ms的延迟。这样在没有指令的时候,便是一直采集。

https://blog.csdn.net/myclass1312/article/details/80762855