OpenCV程式設計實踐小結
1. 影象資料檔案讀取合法性檢查
當我們使用opencv讀取圖片或者使用Deep learning讀取資料集時,如果圖片有問題則會造成錯誤!
如何檢測一個資料夾內所有圖片是否都沒有錯誤呢?這裡總結以下程式碼。
1.使用os模組
-
判斷資料夾是否存在
importos
os.path.exists(test_dir)
#True
os.path.exists(no_exist_dir)
#False
可以看出用os.path.exists()方法,判斷檔案和資料夾是一樣。
該方法通過判斷檔案路徑是否存在和各種訪問模式的許可權返回True或者False。
importos
ifos.access("/file/path/foo.txt",os.F_OK):
print"Given file path is exist."
ifos.access("/file/path/foo.txt",os.R_OK):
print"File is accessible to read"
ifos.access("/file/path/foo.txt",os.W_OK):
print"File is accessible to write"
ifos.access("/file/path/foo.txt",os.X_OK):
print"File is accessible to execute"
2.使用Try-open()語句
try:
f=open()
f.close()
exceptIOError:
print"File is not accessible."
使用try語句進行判斷,處理所有異常非常簡單和優雅的。而且相比其他不需要引入其他外部模組。
3. 使用pathlib模組
pathlib模組在Python3版本中是內建模組,但是在Python2中是需要單獨安裝三方模組。
使用pathlib需要先使用檔案路徑來建立path物件。此路徑可以是檔名或目錄路徑。
-
檢查路徑是否存在
path=pathlib.Path("path/file")
path.exist()
-
檢查路徑是否是檔案
path=pathlib.Path("path/file")
path.is_file()
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Time : 2020/12/29 0029 8:50
@Author : HaoWANG,
@Email : [email protected]
@file :
@Software : Pycharm
@Description:
"""
import os
import pathlib
import cv2 as cv
import numpy as np
img_path = "pictures/dog.jpg"
#
# 方法1 : (推薦) try直接使用open()方法來檢查檔案是否存在和可讀寫。
# try:
# img_file = open(img_path) # 若能open, 則表示無誤;若圖片有問題這裡會有error
# img_file.close()
# img_src = cv.imread(img_path)
#
# except IOError:
# print(img_path + ' ' + 'have problem!')
# pass
# 方法2: 使用pathlib模組
# 檢查路徑是否存在
# path = pathlib.Path(img_path)
# path.exists()
#
# if path.exists() is True:
# img_src = cv.imread(img_path)
# 方法3: 推薦-使用os模組
# os模組中的os.path.exists()方法用於檢驗檔案是否存在。
if not (os.path.exists(img_path) and
os.access(img_path, os.R_OK)):
# 判斷檔案路徑是否存在; 檢查檔案是否可讀
print(img_path + ' ' + 'have problem!')
print("ERROR : File is not exists or un-accessible to read")
else:
print("--------------------------")
print("File is accessible to read")
window_name = "Input Image"
cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
img_src = cv.imread(img_path)
lower_reso = cv.pyrDown(img_src)
cv.imshow(window_name,lower_reso)
cv.waitKey(0)
cv.destroyAllWindows()