大棒棒猪 2019-01-29 16:04 采纳率: 100%
浏览 3648
已采纳

双摄同步问题,利用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。每次要不就是同帧(图片偏差很小),要不就是后面抓取的摄像头会偏慢(黑边伸出的较多),还有就是先抓取的摄像头会偏慢。

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

  • 写回答

2条回答 默认 最新

  • 大棒棒猪 2019-01-30 18:38
    关注

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

                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的延迟。这样在没有指令的时候,便是一直采集。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘