You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu平台Python3.6+OpenCV2实时姿态估计视频无法显示问题

解决cv2.imshow在TensorRT姿态估计实时运行中不显示窗口的问题

我看到你遇到的问题:在Ubuntu上用USB摄像头跑TensorRT姿态估计算法时,cv2.imshow无法显示视频窗口,但单独测试摄像头和cv2.imshow是正常的,代码运行也没有报错。结合你的代码来看,最可能的原因和解决方案如下:

一、最核心的问题:缺少cv2.waitKey()调用

OpenCV的cv2.imshow依赖cv2.waitKey()来处理窗口事件循环,没有这个调用的话,窗口会处于“挂起”状态,无法正常渲染显示。你的代码里的while循环只调用了cv2.imshow,但没有加入waitKey,这是导致窗口不显示的最直接原因。

修改方法:

在cv2.imshow之后添加一行代码:

cv2.imshow("Video", execute(img, dst, t))
# 添加下面这行,1ms的等待时间保证窗口能正常刷新
cv2.waitKey(1)

完整的while循环修改后如下:

while cap.isOpened() and count < 500:
    t = time.time()
    ret_val, dst = cap.read()
    if ret_val == False:
        print("Camera read Error")
        break
    img = cv2.resize(dst, dsize=(WIDTH, HEIGHT), interpolation=cv2.INTER_AREA)
    cv2.imshow("Video", execute(img, dst, t))
    cv2.waitKey(1)  # 新增:处理窗口事件,让画面正常显示
    count += 1
cv2.destroyAllWindows()
cap.release()

二、其他可能的排查点(如果上面的方法无效)

如果添加waitKey后还是无法显示,可以检查以下几点:

1. CUDA与OpenCV的线程同步问题

你的代码中大量使用CUDA进行模型推理,可能存在GPU操作和CPU窗口渲染的线程冲突。可以在推理完成后添加CUDA同步操作:
在execute函数里的cmap, paf = model_trt(data)之后添加:

torch.cuda.synchronize()  # 等待CUDA操作全部完成,再进行后续的CPU图像处理

2. 图像尺寸与压缩系数的正确性

检查X_compress和Y_compress的计算是否匹配实际帧尺寸,避免绘制的关键点超出图像范围导致窗口显示异常:

# 改用实际读取的帧尺寸计算,替代固定的640/480
X_compress = dst.shape[1] / WIDTH
Y_compress = dst.shape[0] / HEIGHT

3. 窗口显示的图像是否被错误覆盖

检查execute函数返回的src是否正确,确保没有被错误操作清空或修改。可以临时修改execute函数,直接返回原始帧测试窗口是否能显示:

# 临时测试:返回原始帧,排除姿态估计绘制逻辑的问题
return dst

总结

优先添加cv2.waitKey(1),这是OpenCV窗口显示的必要条件,绝大多数这类问题都是因为缺少这个调用导致的。如果还是不行,再逐步排查CUDA同步、图像尺寸等问题。

内容的提问来源于stack exchange,提问作者ind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:22:48