OpenCV:开源的视觉库(有C++、Python接口)【提供了丰富的图像操作功能】【Python接口是直接对接numpy的ndarray作为图像存储;C++接口则是cv::Mat进行存储】
OpenCV使用cv2.imencode编码,指定编码格式。
·
OpenCV
- 官网
- Document地址
- 平时使用OpenCV时,主要使用到他的图像读取功能,和图像处理等功能;
- 对于特殊时候,还可以使用OpenCV的DNN功能,直接对pytorch、tensorflow、caffe、darknet、onnx等模型进行推理;
- OpenCV提供了丰富的图像操作功能,还有GPU、OpenCL等的支持;
- 还提供了丰富的视频、图像编解码能力的支持;
- 例如使用ffmpeg或者gstreamer支持的OpenCV,可以实现mp4、h264、h265、avi等视频媒体,基于rtsp、rtmp网络协议的流数据进行操作;
- 使用图像编解码,可以支持jpg、png、tiff、bmp等格式的解析(默认不支持gif);
- OpenCV的Python接口,是直接对接numpy的ndarray作为图像存储,对于C++接口,则是cv::Mat进行存储;
- OpenCV可以进行窗口操作和鼠标响应开发,但是不能够兼容JupyterLab,因此无法在内部显示,会打开新窗口;
- OpenCV读取出来的通道顺序是BGR;
- 安装Python版:
pip install opencv-python
import numpy as np
import cv2 # pip install opencv-python
import matplotlib.pyplot as plt
#plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
#plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
def show(image):
if len(image.shape) == 2:
plt.imshow(image, cmap="gray")
else:
plt.imshow(image[..., ::-1])
# 基本图像操作,得到的是numpy的矩阵
# 注意,无法读取gif图像
image = cv2.imread("x.jpg")
image.shape # (324, 450, 3)
# 图像降低亮度
image_c = image - 50.0
# 裁切避免下溢
image_c = np.clip(image_c, a_min=0, a_max=255).astype(np.uint8)
# 然后保存,如果不指定质量默认95
cv2.imwrite("x.change.jpg", image_c, [cv2.IMWRITE_JPEG_QUALITY, 50])
使用cv2.imencode编码,指定编码格式
status, data = cv2.imencode(".jpg", image_c)
with open("encode.jpg", "wb") as f:
f.write(data)
print(status, data.shape) # (True, (43740, 1))
文件解码问题
-
OpenCV无法读取GIF图像,此时Python的默认图像库PIL Python Image Library,可以读取GIF,以弥补OpenCV的问题
-
PIL无法读取TIFF文件,此时OpenCV可以弥补
-
可以通过cv2.imdecode(data, flags)对图像进行解码
-
如果遇到中文路径问题,cv2.imread可能会失败(取决于系统支持情况),此时可以使用with open的方式读取到数据然后cv2.imdecode从内存解码
# https://docs.opencv.org/4.1.0/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80
with open("x.jpg", "rb") as f:
image_data = f.read()
# flags指定为读取的方式,
# 0表示灰度图(cv2.IMREAD_GRAYSCALE),单通道
# 1表示彩色图(cv2.IMREAD_COLOR),三通道,bgr格式
# -1如果是PNG图像,通常会有透明通道alpha,因此可以指定为cv2.IMREAD_UNCHANGED,读取结果四通道,bgra格式
# cv2.imread同样具有flags参数,只是默认为1,cv2.IMREAD_COLOR
image = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), flags=cv2.IMREAD_COLOR)
print(image.shape) # (324, 450, 3)
更多推荐
所有评论(0)