OpenCV Error: Assertion failed (ssize.area() > 0) in resize, file /home/travis/miniconda/conda-bld/conda_1486587066442/work/opencv-3.1.0/modules/imgproc/src/imgwarp.cpp, line 3229

根據錯誤提示,查看一下opencv源碼中的imgwarp.cpp
發現出錯處為opencv的resize()函數的如下行:
void cv::resize( InputArray _src, OutputArray _dst, Size dsize, double inv_scale_x, double inv_scale_y, int interpolation ) { ...... Mat src = _src.getMat(); Size ssize = src.size(); CV_Assert( ssize.area() > 0 ); CV_Assert( dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0) ); ...... }
最終得出原因:讀入了
路徑不存在的圖
or
空圖(文件大小為0)
or
壞圖(用cv2.imread()讀入會報libpng error並返回一個null值的圖)
libpng Error : read error
判斷圖是否是壞圖(即報libpng error的圖)的方法如下:讀入圖片,如果為壞圖,則會提示libpng error(注意不會拋exception退出),然后返回一個None
>>> import cv2 >>> cv2.imread("4.jpg") libpng error: Read Error
像這樣的圖如果用於caffe 神經網絡的訓練,則會導致resize錯誤,訓練中斷
因此要篩去這三種圖:
1、使用腳本
import os import cv2 DIR='/home/zhangsuosheng/train_random_distance_10_times/' CHECK_FILE='train_headpose.txt' new_file_name=CHECK_FILE+'del' new_file=open(new_file_name,'w') with open(CHECK_FILE) as f: for line in f.read().split('\n'): img_name=line.split(' ')[0] if not os.path.exists(DIR+img_name): # 刪除路徑不存在的圖 print 'no such file:',img_name continue if os.path.getsize(DIR+img_name)==0: # 刪除空圖 print 'size is 0:',img_name continue img=cv2.imread(DIR+img_name) #刪除壞圖 if img is None: print 'img is none',img_name continue if img.shape[0]<=0 or img.shape[1]<=0: print 'wrong shape:',img_name continue new_file.write(line+'\n') new_file.close()
2、使用shell命令
使用shell命令找到空圖
find . -size 0
將找到的空圖從list中刪去
sed -e '/abc/d' a.txt // 刪除a.txt中含"abc"的行,但不改變a.txt文件本身,操作之后的結果在終端顯示
sed -e '/abc/d' a.txt > a.log // 刪除a.txt中含"abc"的行,將操作之后的結果保存到a.log
sed '/abc/d;/efg/d' a.txt > a.log // 刪除含字符串"abc"或“efg"的行,將結果保存到a.log --------------------- 作者:joeblackzqq 來源:CSDN 原文:https://blog.csdn.net/JoeBlackzqq/article/details/6881967 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
使用shell命令刪除空圖
find . -size 0 -exec rm {} \;
刪除空圖之后,還是報這個錯誤。因為空圖文件刪除之后,輸入list中對應條的輸入還沒刪除,所以刪除對應的數據條重新生成list。
