OpenCV中cv.Get2D函数在cv2中的替代语句及UMat报错解决
解决cv.Get2D迁移到cv2的替代方案
我来帮你搞定这个迁移问题!你遇到的TypeError是因为cv2.UMat对象不支持Python的__getitem__操作(也就是用[]索引取值),这和老版本OpenCV里的IplImage对象逻辑不一样。下面给你两种可行的解决方案:
方案1:避免使用UMat,直接用Numpy数组(推荐)
你的代码里主动把读取到的帧转换成了UMat,但其实capture.read()返回的帧本身就是Numpy数组,完全不需要额外转成UMat。修改这一行代码即可:
# 去掉cv2.UMat的转换,直接用原始Numpy数组处理 src = cv2.cvtColor(src, cv2.COLOR_RGB2BGR)
修改后,后续生成的hsv也会是Numpy数组,这时候你原来尝试的s = hsv[y_co, x_co]就能正常工作了——这也是cv2中获取像素最常用的方式,和老版本cv.Get2D()的效果完全一致。
方案2:如果必须保留UMat(比如利用GPU加速)
如果你因为性能需求(比如要用到GPU加速)必须使用UMat,可以先把UMat对象转换成Numpy数组,再进行像素访问:
# 将UMat转换为可索引的Numpy数组 hsv_np = hsv.get() # 用索引获取目标像素值 s = hsv_np[y_co, x_co]
补充说明
老版本的cv.Get2D(hsv, y, x)对应到cv2的逻辑,本质就是对图像的Numpy数组执行[y, x]索引(注意OpenCV是行优先存储,所以y坐标在前,x在后,你的写法是正确的)。而UMat作为OpenCV的统一内存对象,主要用于跨CPU/GPU的内存共享,本身不支持直接索引,必须转成Numpy数组才能用这种方式访问像素。
内容的提问来源于stack exchange,提问作者threewire
相关产品推荐
相关产品推荐

