首页 > 解决方案 > 使用 Python 和 Opencv,如何将 Umat 转换回 mat?

问题描述

我的项目是用 python 3.6 编写的,我使用的是opencvfast.ai

我正在尝试确定 Umat 在某些实时视频分析方面是否能胜过 mat。我有代码可以检测视频帧中的对象,然后得到一个边界框。我裁剪图像,然后将其传递给神经网络。

在我的 cpu 上处理每一帧视频所需的时间约为 23 毫秒。

我想尝试使用 Umat 看看是否可以更快地完成。但是,在将图像输入神经网络之前,需要将其转换回 fastai 可以理解的内容。以下代码适用于常规垫图像。如果我要通过frame而不是uframeto cv2.Umat(),则代码可以完美运行。

# get a frame of video and make a Umat out of it.
frame = video.read()
uframe = cv2.UMat(frame)

# Do stuff to uframe; grayscale, background subtraction, get object coordinates.  

# crop the image. 
cropped_image = cv2.UMat(uframe, [[x1:x2],[y1:y2]])

# color space conversion for fastai compatibility
swapped_image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2RGB)

# convert to fastai Image class
fastai_image = Image(pil2tensor(swapped_image, dtype=np.float32).div_(255))

# Send fastai_image image to neural network.

但是,当我运行如上所示的代码时(传递Uframecv2.Umat()),代码在 处失败fastai_image = Image(pil2tensor(),但出现异常:

ValueError: axes don't match array

我知道这个错误与轴数据的存储方式有关,但我不确定该怎么做。我想将图像转换回垫子,或者可能更改 Umat 的轴数据。有谁知道这样做的最有效方法?

标签: pythonopencvopenclmat

解决方案


推荐阅读