**python cv2报错error: (-215:Assertion failed) **
最近处理处理的一批图像要用到python的cv2这个库,在进行一些函数调用的时候老是爆出这个错,而网上的处理方式参差不齐,自己便做出一篇总结
问题描述:
在深度学习任务的后处理过程中,我的程序报了这个错
# ----------后处理操作把tensor把tensor转成numpy,然后进行闭操作填补空洞,再转为tensor----------#
prob = probs.cpu().numpy()
kernel = np.ones((18, 18), dtype="uint8") / 9 # 闭操作的核为18*18
prob = prob.astype(np.uint8)
prob = cv2.morphologyEx(prob, cv2.MORPH_CLOSE, kernel)
probs = torch.from_numpy(prob)
在预处理的时候报了这个错
labelPath = os.getcwd()+"\\哈哈\\Corp2DGround\\breast_1_108_0007.png"
imgPath = os.getcwd()+"\\哈哈\\newTestData\\breast_1_108_0007.jpg"
img = cv2.imread(imgPath)
label = cv2.imread(labelPath)
#首先使用固定阈值
ret , th1 = cv2.threshold(img,80,255,cv2.THRESH_BINARY)
# cv2.imwrite('1.png',th1)
# print(type(th1))
# print(type(label))
#----------------th1表示的阈值为80的图像,且大于80为255,小于80为0------------#
bitwithAnd = cv2.bitwise_and(label,th1)
原因分析:
第一个错的话就是通道数不匹配,例如在深度学习中输出的图像的shape为[1,2,512,512]然后送入到cv2进行处理,就会报这个错。如果使用的torch的话可以调用torch.squeeze进行压缩,处理完之后再进行unsqueeze操作就行在我的上面处理方式是这样: probs = torch.squeeze(probs,dim=0)
prob = probs.cpu().numpy()
kernel = np.ones((18, 18), dtype="uint8") / 9 # 闭操作的核为18*18
prob = prob.astype(np.uint8)
prob = cv2.morphologyEx(prob, cv2.MORPH_CLOSE, kernel)
probs = torch.from_numpy(prob)
probs = torch.unsqueeze(probs,dim=0)
如果在numpy中也会出现这个问题,像下面这种
kernel = np.ones((5,5),dtype="uint8")/9
bitwithAnd = np.ones((1,1,352,352),dtype="uint8")
closing = cv2.morphologyEx(bitwithAnd,cv2.MORPH_CLOSE,kernel)
也可以使用numpy的squeeze操作。
针对第二个问题的话,大家都看出来了,那个目录里面包含着中文的字符,常见的操作就是全部都改成英文,python的opencv对中文字符较为敏感。如果还是不行的话,可以使用os.getcwd()获取当前目录地址,然后后面跟文件在当前目录下的相对地址,就可以解决。