OpenCV:开源的视觉库(有C++、Python接口)【提供了丰富的图像操作功能】【Python接口是直接对接numpy的ndarray作为图像存储;C++接口则是cv::Mat进行存储】

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)

你可能感兴趣的:(计算机视觉/CV,opencv,python,c++)