OpenCV调用cv2.remap报错(-215:Assertion failed)!_map1.empty()如何解决
错误根源
报错!_map1.empty()的直接原因是传入cv2.remap的inter_mapx是空数组,这是warping_image方法里的切片逻辑错误导致的:
- 对resize后生成的8080大小的map使用了
[80:72]切片:Python切片规则为[起始索引:结束索引],结束索引小于起始索引时会直接返回空数组,且8080数组的索引范围是0~79,起始索引设为80本身就已经越界,最终得到的inter_mapx、inter_mapy都是空值。 - 连续使用两个
[80:72]属于语法错误,同时裁剪高度和宽度的正确二维数组裁剪写法是[高度切片, 宽度切片],而非连续两次对第一维切片。
解决方法
- 修正
warping_image方法中inter_mapx、inter_mapy的切片逻辑,要裁剪8080 map的中间6464区域,正确切片范围是8到72(72-8=64,刚好匹配后续target_image的64*64尺寸)。 - 恢复注释掉的输入尺寸校验,避免因输入图像尺寸不符合设计预期导致的后续映射错误。
- 确保传入
warping_image的图像尺寸为256256的3通道图,当前rotation_matrix方法返回的图像和输入尺寸一致,只要输入训练集图像是256256就没问题。
修改后的代码片段
def warping_image(self, images): # 恢复尺寸校验,提前拦截不符合要求的输入 assert images.shape == (256, 256, 3) range = np.linspace(128 - 80, 128 + 80, 5) map_x = np.broadcast_to(range, (5, 5)) map_y = map_x.T map_x = map_x + np.random.normal(size=(5, 5), scale=5) map_y = map_y + np.random.normal(size=(5, 5), scale=5) # 修正切片写法,同时裁剪高和宽,取中间64*64区域 inter_mapx = cv2.resize(map_x, (80, 80))[8:72, 8:72].astype('float32') inter_mapy = cv2.resize(map_y, (80, 80))[8:72, 8:72].astype('float32') warped_image = cv2.remap(images, inter_mapx, inter_mapy, cv2.INTER_LINEAR) src_points = np.stack([map_x.ravel(), map_y.ravel()], axis=-1) dst_points = np.mgrid[0:65:16, 0:65:16].T.reshape(-1, 2) mat = umeyama(src_points, dst_points, True)[0:2] target_image = cv2.warpAffine(images, mat, (64, 64)) return warped_image, target_image
内容的提问来源于stack exchange,提问作者pasho_6798
相关产品推荐
相关产品推荐

