• 【opencv】caffe 读入空图导致opencv错误


    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('
    '):
            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+'
    ')
    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。 

  • 相关阅读:
    HttpClient调用RestFul接口(post和get方式)
    mysql权限异常
    javascript:用法
    Java哈希值HashCode理解
    Java的CountDownLatch和CyclicBarrier的理解和区别
    Java并发编程与技术内幕:ThreadGroup线程组应用
    面试官: 谈谈什么是守护线程以及作用 ?
    java 成员变量 静态成员变量 方法 静态方法初始化顺序
    【java并发核心一】Semaphore 的使用思路
    threadlocal原理及常用应用场景
  • 原文地址:https://www.cnblogs.com/zealousness/p/9923965.html
Copyright © 2020-2023  润新知