用OpenCV人臉檢測,出現這個錯誤,大神賜教?

Libpng warning:image width is zero in IHDR

Libpng warning:image height is zero in IHDR

Libpng error:invalid IHDR data


昨晚遇到了這個問題,搜索到知乎的這個問題,發現無人答,委屈臉~~。

百度半天無所得,最後用另外一種笨方法解決了這個問題,強答一下,希望下一個滿懷希望搜到這個問題跑來知乎的人不會像我一樣落了空。

首先,百度一下IHDR:

PNG的文件結構

對於一個PNG文件來說,其文件頭總是由位固定的位元組來描述的:

其中第一個位元組0x89超出了ASCII字元的範圍,這是為了避免某些軟體將PNG文件當做文本文件來處理。文件中剩餘的部分由3個以上的PNG的數據塊(Chunk)按照特定的順序組成,因此,一個標準的PNG文件結構應該如下:

這就清晰一點了,一個PNG圖像分為文件頭和數據塊,在文件頭之後由PNG數據塊組成,而IHDR就是第一個PNG數據塊,用來描述PNG文件中存儲的圖像數據的基本信息。

IHDR由13位元組組成,它的格式如下表所示:

回頭來看我們的錯誤信息:

libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data

然後知道原因是IHDR數據塊中的width和height被置為0.

為什麼呢?

我的原因是因為讀取.jpeg格式之後將其賦予給一個.png格式,出現了錯誤。

我的解決方案是:在處理之前,先進行圖片格式的處理:

# 將原始jpeg圖片改為jpg,以避免可能出現的格式讀取問題;
def formatTransfer(imgPath):
for path, subdirs, files in os.walk(imgPath):
for filename in files:
current_file = os.path.join(path, filename)
# 修改輸出擴展名為.jpg
lower4 = os.path.splitext(current_file)[1]
if lower4 == ".jpg":
continue
else :
outfile = os.path.splitext(current_file)[0] + ".jpg"
# 捕獲異常,以使得異常之後能繼續處理:
try:
# 打開原始圖像並存入新文件
Image.open(current_file).save(outfile)
os.remove(current_file)
except IOError:
# 錯誤處理
# do nothing...
continue

這裡我將jpeg轉換成了jpg格式,如果不放心的話可以直接轉換成png,改一下後綴就可以啦~~

雖然網上到處說:

而用JPEG演算法壓縮出來的靜態圖片文件稱為JPEG文件,擴展名通常為*.jpg、*.jpe*.jpeg。

但好像jpeg和jpg還是確有不同。。。

另外,值得一提的是:

開始我用jpeg的時候,其實也並不是全部失敗,10張樣本圖片只有3張報錯,而換成jpg之後就全部success了。

不是很懂,圖像編解碼的水很深啊。。。

不足之處大神指正。。。

推薦閱讀:

http://blog.csdn.net/bisword/article/details/2777121

[轉載]探索PNG(一)--PNG初探,IHDR Chunk

以及:這段轉換格式的代碼,也就是我的GitHub:【雖然剛剛建立,還沒什麼東西】

oukohou/python_opencvSamples


告訴你一個秘密:出現這個錯誤是因為你圖片路徑中含有中文字元


我也遇到這個問題


用google吧


純從英語的角度而言就是png處理出錯。。。

具體就不清楚了,你說的太不詳細了


推薦閱讀:

在 MFC 框架中,有什麼方法能直接將 OpenCV 2.0 庫中 Mat 格式的圖片傳遞到 Picture Control(圖片控制項)顯示?
關於opencv中對齊圖片的問題?
做增強現實AR,高通sdk與opencv有什麼區別。各有什麼利弊?
有什麼好的機器視覺相關網站推薦呢?
opencv Mat類型的轉換問題?

TAG:人臉識別 | OpenCV |