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
相关产品推荐
相关产品推荐

