搜索
bottom↓
回复: 18

请大家出谋划策,基于usb摄像头的系统,延迟怎么优化

[复制链接]

出0入18汤圆

发表于 2023-2-27 15:21:47 | 显示全部楼层 |阅读模式
系统的基本功能是,用usb摄像头进行目标追踪,然后将识别到的坐标通过usb串口发送出来
我用python写了个测试程序,测试从目标进入摄像头,到串口接收到检测坐标的延迟时间为70ms左右
测试程序是用两个线程跑,一个线程读摄像头,一个线程检测目标,两边的帧率都能达到60Hz以上,但延迟却要70ms左右,也就是4帧左右
这个延迟主要是在哪里产生的,如何优化呢,请大家出谋划策一下吧,非常感谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入36汤圆

发表于 2023-2-27 15:42:43 | 显示全部楼层
你能不能描述清楚一些,你的usb摄像头接到啥cpu上了?串口数据从哪里usb转串口上出去的。
你描述的一塌糊涂。

出0入0汤圆

发表于 2023-2-27 15:43:30 来自手机 | 显示全部楼层
分段测量时间消耗 再看哪里能优化
70ms看着差不多正常

出0入18汤圆

 楼主| 发表于 2023-2-27 15:58:09 | 显示全部楼层
redworlf007 发表于 2023-2-27 15:42
你能不能描述清楚一些,你的usb摄像头接到啥cpu上了?串口数据从哪里usb转串口上出去的。
你描述的一塌糊涂 ...
(引用自2楼)

就是普通的个人电脑,都是接到电脑usb接口上的
win11系统,i9-12900K cpu

出0入36汤圆

发表于 2023-2-27 16:03:15 | 显示全部楼层
smbxfdbz 发表于 2023-2-27 15:58
就是普通的个人电脑,都是接到电脑usb接口上的
win11系统,i9-12900K cpu
(引用自4楼)

你用程序打印下,你的程序拿到图片的时间、检测到物体的时间、算出坐标的时间、串口打印的时间,分别在日志里面写出来或者打印的调试信息里面,看看到底是哪里用的时间长。

出0入18汤圆

 楼主| 发表于 2023-2-27 16:04:10 | 显示全部楼层
lyxer 发表于 2023-2-27 15:43
分段测量时间消耗 再看哪里能优化
70ms看着差不多正常
(引用自3楼)

已经分不下去了,我是把摄像头放到暗盒里,一开灯,就会拍摄到画面
主要延迟就是从开灯到拍摄到画面这段时间,用opencv,这个部分就只有一行代码,就是cap.read()
这个读与摄像头帧率是同步的,可以达到60fps,但从开灯到读到画面,却要用掉4帧左右的时间,主要是想优化这个延时

出0入18汤圆

 楼主| 发表于 2023-2-27 16:08:43 | 显示全部楼层
redworlf007 发表于 2023-2-27 16:03
你用程序打印下,你的程序拿到图片的时间、检测到物体的时间、算出坐标的时间、串口打印的时间,分别在日 ...
(引用自5楼)

参考楼上回复
就是从开灯,到摄像头读取到亮的画面,延迟特别久,但这个部分只有一行cap.read代码(用opencv)
也就是延迟都发生在底层驱动部分,这部分对应用软件根本不可见,有什么办法优化呢?

出0入0汤圆

发表于 2023-2-27 16:13:57 | 显示全部楼层
多大分辨率?例如高清USB2.0摄像头,在电脑上看,就是6-10帧左右。

出40入518汤圆

发表于 2023-2-27 16:14:59 | 显示全部楼层
开灯这个方法测试可能不严谨吧?灯太暗的时候影响曝光时间吧?
我们以前测试是用个毫秒表在显示器上面跳,摄像头对着,画面同样再显示器上面显示,用手机录像
回放看视频的时候可以看到画面两个毫秒表之间的时间差

出0入18汤圆

 楼主| 发表于 2023-2-27 16:22:30 | 显示全部楼层
智涅 发表于 2023-2-27 16:14
开灯这个方法测试可能不严谨吧?灯太暗的时候影响曝光时间吧?
我们以前测试是用个毫秒表在显示器上面跳, ...
(引用自9楼)

我是把曝光时间固定进行测试,结合示波器测量开灯信号与串口指令的时间差
感觉还是比较严谨的,开关灯,曝光时间不会变化的

你这种测试方法感觉也不太准,因为显示器的刷新率一般也就是60Hz,刷新一帧都要16ms了,精确不到ms级的测量

出0入18汤圆

 楼主| 发表于 2023-2-27 16:23:50 | 显示全部楼层
locky_z 发表于 2023-2-27 16:13
多大分辨率?例如高清USB2.0摄像头,在电脑上看,就是6-10帧左右。
(引用自8楼)

我用的是高帧率摄像头,1280x720分辨率,读帧率能到120Hz

出0入84汤圆

发表于 2023-2-27 16:49:01 | 显示全部楼层
用显示器显示一个毫秒级别的数字时间表, 然后把各阶段的图片同时抓图,就知道是哪个步骤产生的延时了。

出0入0汤圆

发表于 2023-2-27 17:45:01 | 显示全部楼层
可以用DirectShow打开摄像头试试

出0入33汤圆

发表于 2023-2-27 17:52:38 来自手机 | 显示全部楼层
不要用cv,用pygame开摄像头快得多

出0入0汤圆

发表于 2023-2-27 23:46:20 | 显示全部楼层
可以试试修改opencv的代码,把MAX_V4L_BUFFERS降低

出0入309汤圆

发表于 2023-2-28 09:05:36 | 显示全部楼层
关注一下这个问题。我之前也遇到了。

https://stackoverflow.com/questi ... er-in-opencv-camera

好像我当时的方法是反复读直到读不出来,这样可以部分回避缓存的影响。

出0入90汤圆

发表于 2023-2-28 09:17:04 | 显示全部楼层
本帖最后由 honami520 于 2023-2-28 09:18 编辑

我以前做过一次USB摄像头的项目,当时就发现光线暗的时候帧率会降低,最后自己总结是曝光的问题,然后就没管了。
当时用的qt+opencv来做的。现象是拿手在摄像头前晃动,然后画面显示到液晶屏上面。白天的时候延迟小,晚上光线暗手就跟不上画面了

出0入18汤圆

 楼主| 发表于 2023-2-28 09:45:54 | 显示全部楼层
vtte 发表于 2023-2-27 17:52
不要用cv,用pygame开摄像头快得多
(引用自14楼)

你实测过对比过吗?
我用pygame测试,用同样的测试方法,用pygame的get_image()方法,帧率上不去,只能到40多帧,但是用opencv的VideoCapture.read(),帧率能到80多,摄像头本身是能到120帧的
还有个奇怪的问题,即使在单独的线程里,用pygame读摄像头,也会严重挤占cpu资源,导致图像检测线程帧率严重下降,整个程序占用的cpu资源始终在10%以下
但是用opencv读摄像头,图像检测线程的帧率会快很多,整个程序占用的cpu资源能到18%
用pygame,测试帧率在40多,延迟时间在120ms左右
用opencv,测试帧率能到80多,延迟时间在80ms左右

如何改进呢,帮忙分析一下吧
下面是分别使用opencv和pygame读摄像头的代码

#使用opencv
def read_cam():
    # 创建相机对象
    # 设置相机
    cap1 = cv2.VideoCapture(701)
    cap1.set(3, 1280)
    cap1.set(4, 720)

    cap2 = cv2.VideoCapture(700)
    cap2.set(3, 1280)
    cap2.set(4, 720)
    print("曝光:", cap1.get(15), cap2.get(15))

    cnt = 0;
    time_last = time.time()
    while True:
        # 读取摄像头图像
        ret1, frame1 = cap1.read()
        ret2, frame2 = cap2.read()
        height, width = frame1.shape[:2]
        # 高度裁剪为32的整数倍
        cropped_frame1 = frame1[8:height - 8, :]
        cropped_frame2 = frame2[8:height - 8, :]
        # 垂直拼接和缩放图像
        frame_lr = cv2.vconcat([cropped_frame1,cropped_frame2])
        frame_lr = cv2.resize(frame_lr,(640,704))
        # read_cam.frame = frame_lr
        frame_queue.put(frame_lr)
        # 统计帧率
        cnt = cnt + 1;
        if(cnt == 99):
            cnt = 0;
            time_interval = time.time()-time_last
            time_last = time.time()
            fps = 100/time_interval
            fps = round(fps,1)
            print("read_cam帧率:",fps,np.size(frame_lr),np.shape(frame_lr))

#使用pygame
def read_cam():
    # 创建相机对象
    # 设置相机
    pygame.init()
    pygame.camera.init()

    # 获取摄像头列表
    cam_list = pygame.camera.list_cameras()
    if not cam_list:
        print('没有找到摄像头!')
        quit()

    # 选择第一个摄像头
    cam1 = pygame.camera.Camera(cam_list[0],(1280,720))
    cam2 = pygame.camera.Camera(cam_list[1],(1280,720))
    cam1.start()
    cam2.start()

    cnt = 0;
    time_last = time.time()
    while True:
        # 读取摄像头图像
        image1 = cam1.get_image() # 阻塞等待摄像头响应
        image1 = pygame.transform.rotate(image1, 90)
        cv_image1 = cv2.cvtColor(pygame.surfarray.array3d(image1),cv2.COLOR_RGB2BGR)

        image2 = cam2.get_image()  # 阻塞等待摄像头响应
        image2 = pygame.transform.rotate(image2, 90)
        cv_image2 = cv2.cvtColor(pygame.surfarray.array3d(image2),cv2.COLOR_RGB2BGR)

        height, width = cv_image1.shape[:2]
        # 高度裁剪为32的整数倍
        cropped_frame1 = cv_image1[8:height - 8, :]
        cropped_frame2 = cv_image2[8:height - 8, :]
        # 垂直拼接和缩放图像
        frame_lr = cv2.vconcat([cropped_frame1,cropped_frame2])
        frame_lr = cv2.resize(frame_lr,(640,704))
        # read_cam.frame = frame_lr
        frame_queue.put(frame_lr)
        # 统计帧率
        cnt = cnt + 1;
        if(cnt == 99):
            cnt = 0;
            time_interval = time.time()-time_last
            time_last = time.time()
            fps = 100/time_interval
            fps = round(fps,1)
            print("read_cam帧率:",fps)

出40入518汤圆

发表于 2023-2-28 11:27:02 | 显示全部楼层
哦对了,我之前测试,python里头的多线程只会用一个cpu核,真正要想把性能干爆需要用【多进程】
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-15 20:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表