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】caffe 读入空图导致opencv错误

 

根据错误提示,查看一下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。