如何修复"TypeError: Expected Ptr<cv::UMat> for argument '%s'"



我正在编写代码来使用 CUDA 加速我的程序,但我遇到了一个棘手的错误。我对此一无所知。我的环境是OpenCV 4.1.1,python 3.6。 这是我的代码。

我定义了一个函数来旋转 img,

def rotate(img, angle):
'''
'''    
if len(img.shape) == 3:
(rows, cols, channels) = img.shape
out_size = (cols, rows, channels)
else:
(rows, cols) = img.shape
out_size = (cols, rows)
if angle == 0:
dst = img
else:
# img_gpu = cv2.cuda_GpuMat()
img_gpu = cv2.cuda_GpuMat()
out_gpu = cv2.cuda_GpuMat()
#         M_gpu = cv2.cuda_GpuMat()
#         out_size_gpu = cv2.cuda_GpuMat()
#         border_value_gpu = cv2.cuda_GpuMat()
m = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1) 
img_gpu.upload(img)
#         M_gpu.upload(M)
#         out_size_gpu.upload((12000, 6000))
#         border_value_gpu.upload((0, 0, 0))
cols_gpu = cv2.cuda_GpuMat()
rows_gpu = cv2.cuda_GpuMat()
cols_gpu.upload(cols)
rows_gpu.upload(rows)
print(type(img))
print(img.shape)
(row,col) = img.shape
print([img_gpu.size()[0],img_gpu.size()[1]])
#         M = np.float32([[1,0,100],[0,1,50]])
#         out=cv2.UMat(out_gpu,(284,284))
out_gpu = cv2.cuda.warpAffine(img_gpu, m, (col,row))
dst = out_gpu.download()
return dst

那我叫它。

img = cv2.imread('../FengZhan/temp.png',0)
img_rotate = rotate(img, -10)

它无法工作,并具有以下错误:

<ipython-input-48-41cd06952793> in rotate(img, angle)
36 #         M = np.float32([[1,0,100],[0,1,50]])
37 #         out=cv2.UMat(out_gpu,(284,284))
---> 38         out_gpu = cv2.cuda.warpAffine(img_gpu, m, (col,row))
39 
40         dst = out_gpu.download()
TypeError: Expected Ptr<cv::UMat> for argument '%s'

我试图用 cv2 替换img_gpu。UMat(img_gpu(,但它仍然无法工作。 有人帮我吗?

我收到此错误:TypeError: Expected Ptr<cv::UMat> for argument '%s'

法典:

image = cv2.imread("image_path")
image = cv2.cvtColor(np.array(image), cv2.COLOR_BGR2GRAY)

仅仅是因为图像路径不正确,并且我正在加载不存在的图像。我知道这可能不是您的情况,但我希望它可以帮助遇到此错误的其他人。

我不明白你为什么在开头定义out_gpu = cv2.cuda_GpuMat().最后,您再次将其设置为:out_gpu = cv2.cuda.warpAffine(img_gpu, m, (col,row)).

您收到此错误的原因可能是因为您的代码out_gpu = cv2.cuda.warpAffine(img_gpu, m, (col,row))参数img_gpu应该是指向图像的字符串链接,但它之前被定义为img_gpu = cv2.cuda_GpuMat()。尝试通过将行img_gpu.upload(img)替换为uploaded_img = img_gpu.upload(img)来更正此问题

将图像更改为数字数组

np.array(image)

这似乎是 OpenCV 的一个错误,因为我在 OpenCV 上发布 python 的 cuda 绑定似乎收到了错误的参数类型cudawarping/src/warp.cpp#2393。

但是,即使我修复了这个错误,速度也不令人满意(比CPU版本慢(,如果还有其他技巧,也许我们可以互相分享。

祝你好运。

相关内容

最新更新