opencv 读取图片返回None,但是不报错
原因
- 可能是因为路径中有中文导致的
- 也可能是图片格式有误。图片名称虽然是png、jpg或者jpeg。实际的图片格式可能是gif等。opencv读取gif时候会出错
路径中有中文的解决方法
借助numpy读取之后,转为opencv 的图片格式
读取图片
import os
import numpy as np
import cv2
img = cv2.imdecode(np.fromfile(os.path.join(img_dir, file_name), dtype=np.uint8), -1)
opencv imread和imdecode 最后一个参数flag的取值如下
IMREAD_ANYCOLOR : 4
IMREAD_ANYDEPTH : 2
IMREAD_COLOR : 1
IMREAD_GRAYSCALE : 0
IMREAD_IGNORE_ORIENTATION : 128
IMREAD_LOAD_GDAL : 8
IMREAD_REDUCED_COLOR_2 : 17
IMREAD_REDUCED_COLOR_4 : 33
IMREAD_REDUCED_COLOR_8 : 65
IMREAD_REDUCED_GRAYSCALE_2 : 16
IMREAD_REDUCED_GRAYSCALE_4 : 32
IMREAD_REDUCED_GRAYSCALE_8 : 64
IMREAD_UNCHANGED : -1
IMREAD_UNCHANGED :不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
IMREAD_GRAYSCALE :进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
IMREAD_COLOR :进行转化为三通道图像。
IMREAD_ANYDEPTH :如果图像深度为16位则读出为16位,32位则读出为32位,其余的转化为8位。
IMREAD_ANYCOLOR :
IMREAD_LOAD_GDAL :使用GDAL驱动读取文件,GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
保存图片
cv2.imencode('.jpg', img)[1].tofile(savePath)
图片格式问题
使用PIL把图片从gif转为一般图片
import os
from PIL import Image
img = Image.open(os.path.join(img_dir, file_name)).convert('RGB')
img.save(os.path.join('imgs1', file_name))