【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('\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。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM