web-dev-qa-db-fra.com

Comment corriger "TypeError: Ptr attendu <cv :: UMat> pour l'argument '% s'"

J'écris des codes pour accélérer mon programme en utilisant CUDA, mais j'ai eu une erreur délicate. Je n'en ai aucune idée. Mon environnement est OpenCV 4.1.1, python 3.6. Voici mon code.

Je définis une fonction pour faire tourner l'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

alors je l'appelle.

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

il ne peut pas fonctionner et a l'erreur suivante:

<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'

J'ai essayé de remplacer img_gpu par cv2.UMat (img_gpu), mais cela ne fonctionne toujours pas. Quelqu'un m'aide?

4
crazycao

Il semble que ce soit un bogue pour OpenCV comme je l'ai publié à les liaisons cuda OpenCV pour python semblent recevoir des types de paramètres incorrects pour cudawarping/src/warp.cpp # 239 .

Cependant, même si je corrige ce bug, la vitesse n'est pas satisfaisante (plus lente que la version CPU), s'il y a d'autres astuces, nous pouvons peut-être les partager.

Bonne chance.

0
miaodx