python 探究is_dir函數及其使用案例(讀取人臉圖片)附整體代碼

定義:檢測指定的文件是否是一個目錄,如果是則返回TRUE、否則返回FALSE


用法:

>>>type(info)
<class 'zipfile.ZipInfo'>
>>>info.is_dir()
True

讀取人臉案例分析

  1. 導入人臉圖片的信息庫(img_ali.gn_cel.eba.zip
  2. 由於信息庫是壓縮包,我們需要調用python中的zipfile模塊來對壓縮包進行解壓
  3. 使用read命令來獲得文件庫中的圖片信息
  4. 此時獲得的圖片信息是以流的形式進行展示的,我們需要使用Numpy中的frombuffer方法,將流數據轉換爲ndarray對象
  5. 使用cv2中自帶的imdecode方法將獲得的一維的ndarray轉換成三個通過的彩色圖片
  6. 顯示圖片

導入相應的模塊

import zipfile 
import numpy as np # Numpy
import cv2  # OpenCV

獲得圖片的相對路徑:

path = "..\\dl_data\\samples\\Img\\img_ali.gn_cel.eba.zip"

對文件夾進行解壓(這裏使用with…as…的用法。該用法稍後解釋):

with zipfile.ZipFile(path) as zf:

開始遍歷解壓後的文件列表

for info in zf.filelist:

判斷獲得的info是否是目錄,如果是目錄則退出遍歷

if info.is_dir(): continue

讀取圖片的流信息

img = zf.read(info.filename)

此時獲得的圖片信息如下:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01...

將獲得的流信息轉換成ndarray對象

img = np.frombuffer(img, np.uint8)

此時圖片的信息如下:

array([255, 216, 255, ...,  71, 255, 217], dtype=uint8)

由於此時的圖片是1維的需要通過OpenCV進行解碼

img = cv2.imdecode(img,1)

最終得到的圖片如下:

array([[[194, 231, 253],
        [194, 231, 253],
        [194, 231, 253],
        ...,
        [216, 228, 246],
        [223, 237, 255],
        [222, 238, 254]],

       [[194, 231, 253],
        [194, 231, 253],
        [194, 231, 253],
        ...,
        [218, 230, 248],
        [223, 237, 255],
        [222, 238, 254]],

       [[194, 231, 253],
        [194, 231, 253],
        [194, 231, 253],
        ...,
        [220, 232, 250],
        [224, 238, 255],
        [223, 239, 255]],

       ...,

       [[ 26,  74, 140],
        [  1,  49, 115],
        [ 33,  78, 146],
        ...,
        [ 28,  55, 122],
        [ 30,  56, 123],
        [ 30,  56, 122]],

       [[ 15,  62, 130],
        [ 23,  70, 138],
        [ 53,  98, 166],
        ...,
        [ 20,  49, 118],
        [ 24,  50, 120],
        [ 24,  51, 118]],

       [[ 53, 100, 168],
        [ 89, 136, 204],
        [132, 177, 245],
        ...,
        [ 20,  49, 118],
        [ 24,  50, 120],
        [ 24,  50, 120]]], dtype=uint8)

顯示圖片:

            cv2.imshow("img1", img)
            cv2.waitKey(0)

顯示如下:
在這裏插入圖片描述


整體代碼如下:

# -*-coding:utf-8-*-
import zipfile
import numpy as np
import cv2

if __name__ == '__main__':
    path = "E:\\dl_data\\samples\\Img\\img_ali.gn_cel.eba.zip"

    with zipfile.ZipFile(path) as zf:
        for info in zf.filelist:
            if info.is_dir(): continue
            print(info)
            img = zf.read(info.filename)
            img = np.frombuffer(img, np.uint8)
            img = cv2.imdecode(img,1)
            cv2.imshow("img1", img)
            cv2.waitKey(2000)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章