参考

环境

  • 我使用的是annaconda的环境,自行搜索

  • 要先熟悉了numpy之后再学习OpenCV

图像导入

# 读取图像
# 用灰度模式加载图像
newImg = cv.imread('./img/learn2.png', 0) # 即使图像路径错误,它也不会抛出任何错误,但是打印 img会给你None
cv.imshow('image', newImg)
cv.waitKey(0) # 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。如果你在这段时间内按下任意键,程序将继续。
cv.destroyAllWindows() # 简单的销毁我们创建的所有窗口
# 如果你想销毁任意指定窗口,应该使用函数 cv.destroyWindow() 参数是确切的窗口名。

# 或者
cv.namedWindow('image', cv.WINDOW_NORMAL) # 窗口可以调整大小
cv.imshow('image', newImg)
cv.waitKey(0)
cv.destroyAllWindows()

# 保存图像
cv.imwrite('./newNewImg.png', newImg)

一个小的实现,打开窗口,esc关闭,s保存

import cv2 as cv
import numpy as np

img1 = cv.imread('./img/learn2.png',0)
cv.imshow('image',img1)
k = cv.waitKey(0)
if k == 27: # ESC 退出
cv.destroyAllWindows()
elif k == ord('s'): # 's' 保存退出
cv.imwrite('messigray.png',img1)
cv.destroyAllWindows()

官方这样说,如果你使用的是 64 位机器,你需要修改k = cv.waitKey(0)像这样:k = cv.waitKey(0) & 0xFF

使用Matplotlib

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img1 = cv.imread('./img/learn2.png',0)
plt.imshow(img1, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值
plt.show()
  • 彩色图像 OpenCV 用的 BGR 模式,但是 Matplotlib 显示用的 RGB 模式。因此如果图像用 OpenCV 加载,则 Matplotlib 中彩色图像将无法正常显示。更多细节请看练习。

视频基本操作

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(1) #0应该是内置相机,但是很奇怪我的是1
while(True):
# 一帧一帧捕捉
ret, frame = cap.read()
frame = cv.flip(frame, 1) # 摄像头是和人对立的,将图像左右调换回来正常显示。
# 我们对帧的操作在这里
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示返回的每帧
cv.imshow('frame',gray)
if cv.waitKey(1) & 0xFF == ord('q'):
break
# 当所有事完成,释放 VideoCapture 对象
cap.release()
cv.destroyAllWindows()

图像基本操作

先来理解一下,图像与一般的矩阵或张量有何不同(不考虑图像的格式,元数据等信息)。首先,一张图像有自己的属性,宽,高,通道数。其中宽和高是我们肉眼可见的属性,而通道数则是图像能呈现色彩的属性。我们都知道,光学三原色是红色,绿色和蓝色,这三种颜色的混合可以形成任意的颜色。常见的图像的像素通道也是对应的R,G,B三个通道,在OpenCV中,每个通道的取值为0~255,。(注:还有RGBA,YCrCb,HSV等其他图像通道表示)。即,一般彩色图像读进内存之后是一个h * w * c的矩阵,其中h为图像高(相当于矩阵的行),w为图像宽(相当于矩阵列),c为通道数。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 访问修改像素值
# 读取图像
img = cv.imread("./img/learn.png")
# 返回的是一个蓝色(Blue)、绿色(Green)、红色(Red)值的数组
print(img)
h, w, c = img.shape
# 对于单个像素的访问,可以选择使用 Numpy 数组方法中的 array.item()和 array.itemset(),注意它们的返回值是一个标量。如果需要访问所有的 G、R、B 的值,则需要分别为所有的调用 array.item()。
# 分别表示 高、宽、维度
print(h, w, c)
# 输出:1080 1920 3

# 大小总像素数
print(img.size)
# 图像数据类型
print(img.dtype)

img1 = img[100, 100]
print("img1:", img1) # img1: [ 0 255 255]
# OpenCV的读取顺序为B,G,R,由于图像所有像素为黄色,因此,G=255,R=255
ar = np.array([0, 255, 255], dtype='uint8')
# 仅访问蓝色通道的像素
blue = img[100, 100, 0]
print(blue) # 0
green = img[100, 100, 1]
print(green) # 255
red = img[100, 100, 2]
print(red) # 255
# 修改某个像素点的像素值
img[100, 100] = [255, 255, 255]
print(img[100, 100]) # [255 255 255]
# 图像中感兴趣的区域