如何修复“ TypeError:参数'%s'的预期Ptr <cv :: UMat>”

时间:2019-08-06 03:19:28

标签: python-3.x opencv

我正在编写代码以使用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.UMat(img_gpu)替换img_gpu,但仍然无法正常工作。 有人帮我吗?

4 个答案:

答案 0 :(得分:5)

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

代码:

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

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

答案 1 :(得分:1)

我不明白您为什么在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)

来纠正此问题

答案 2 :(得分:0)

正如我在OpenCV cuda bindings for python seem receive wrong param types for cudawarping/src/warp.cpp #2393上发布的那样,这似乎是OpenCV的一个错误。

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

祝你好运。

答案 3 :(得分:0)

将您的图像更改为 numpy 数组

np.array(image)