[Bug] python之OpenCV:(-215:Assertion failed) !_img.empty() in function ‘imwrite‘

1.问题描述:已知bbox,裁剪图像并保存

2.代码细节:

...
for bbox_idx, bbox in enumerate(bbox_list):
	img_clip = img[bbox[1]:bbox[3], bbox[0]:bbox[2], :]
	cv2.imwrite('./{}.png'.format(bbox_idx),img_clip)
...

3.报错: 运行成功几张图片后报错

cv2.error: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:801: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'

4. 问题分析:

分析:运行几张图片后成功,说明某一张图片,或者某一张图的bbox有问题; 打印出每个bbox数值:

...
#for bbox_idx, bbox in enumerate(bbox_list):
#	img_clip = img[bbox[1]:bbox[3], bbox[0]:bbox[2], :]
	print(bbox)
#	cv2.imwrite('./{}.png'.format(bbox_idx),img_clip)
...
...
[144 248 232 423   2]
[144 247 233 425   2]
[142 251 230 428   2]
[  0 263  56 441   4]
[140 256 228 432   2]
[  0 262  54 442   4]
[  0 259  53 445   4]
[ -3 257  48 446   4] ## 出现负数
...
cv2.error: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:801: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'

5. 问题原因:

bbox在检测过程中出了图像边界,导致出现负数,可视化如下图:
[Bug] python之OpenCV:(-215:Assertion failed) !_img.empty() in function ‘imwrite‘_第1张图片
将所有小于0的值归零,问题解决:

...
#for bbox_idx, bbox in enumerate(bbox_list):
	bbox[bbox < 0] = 0
#	img_clip = img[bbox[1]:bbox[3], bbox[0]:bbox[2], :]
#	cv2.imwrite('./{}.png'.format(bbox_idx),img_clip)
...

6. 总结:

	这是cv2.imwrite()的问题,首先确保路径正确,其次img注意以下问题:
	1.分割的最小值不能小于0
	2.分割的最大值不能大于图片的宽和高
	3.分割的最大值要大于分割的最小值

参考:https://xiulian.blog.csdn.net/article/details/106156340

你可能感兴趣的:(opencv,python,bug)