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?
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.