opencv基础操作
import matplotlib.pyplot as plt
%matplotlib inline
import cv2
import numpy as np
cv2.imread()方法会把一张图片读入成一个ndarray的形式
img = cv2.imread("001.jpg")
print(img.shape, type(img))
(1200, 1920, 3) <class 'numpy.ndarray'>
opencv读入彩色图片后默认颜色通道顺序是:BGR
- 所以用opencv自带的显示图像的方法没有问题,但用matplotlib时就需要转换成RGB格式
- opencv自带图像显示方法
def cvshow(name, ndarray):
# 第一个参数表示显示窗口的名字,第二个参数表示数据
cv2.imshow(name, ndarray)
# 表示等待多久窗口关闭,毫秒单位。0表示按任意键结束
cv2.waitKey(0)
cv2.destroyAllWindows()
cvshow("001", img)
选择读入图像的格式:
- cv2.IMREAD_COLOR 彩色图像
- cv2.IMREAD_GRAYSCALE 灰度图像
gray = cv2.imread("001.jpg", cv2.IMREAD_GRAYSCALE)
gray.shape
(1200, 1920)
cvshow("002", gray)
- 图像区域的截取 ROI
- 既然读入的图像是作为ndaaray格式的,那么就可以进行切片得到部分区域
region = img[100:800, 200: 1000]
cvshow("region", region)
- 彩色图像的颜色通道分离
# 可以用 cv2.split()方法分割,也可以用numpy的索引和切片分割
b, g, r = cv2.split(img)
b.shape
(1200, 1920)
- 仅显示某些颜色通道
copy = img.copy()
# 仅显示蓝色通道
copy[:, :, 1] = 0
copy[:, :, 2] = 0
cvshow("blue", copy)
- 图像填充
- cv2.copyMakeBorder() 传入数据,上下左右填充的大小,以及填充方式
- 不同的填充方式只需要改变BorderType的值
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
constant = cv2.copyMakeBorder(region, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT, value=0)
cvshow("constant", constant)
数值计算
既然opencv读取进来的图像数据是以ndarray形式保存的,那就可以进行数值计算
# 对用数值超过255的部分就被舍弃了
res = img + img
cvshow("res", res)
# 对比一下 171*2-255=87 所以表示成86,因为0还占1位
print(img[:2, :2, 1])
print(res[:2, :2, 1])
[[171 165]
[167 173]]
[[86 74]
[78 90]]
# cv2.add(img1, img2) 也有一样的效果,但是数值超过255的,就置为255
add_res = cv2.add(img, img)
add_res[:2, :2, 1]
cvshow("add_res", add_res)
res_sub = cv2.subtract(img, img)
cvshow("res_sub", res_sub)
图像融合
img2 = cv2.imread("003.jpg")
print(img2.shape)
print(img.shape)
# 两张图像要融合 需要resize成相同尺寸,并且cv2.resize()中的尺寸只接受两个参数,还是相反的。比如你想变成5行3列,就得填(3, 5)
img3 = cv2.resize(img2, (1920, 1200))
img3.shape
fusion = cv2.addWeighted(img, 0.3, img3, 0.7, 0)
cvshow("fusion", fusion)
(2480, 3508, 3)
(1200, 1920, 3)
# 也可以不指定具体尺寸,只说明比例。但要把尺寸的值写成(0, 0)
region_t = cv2.resize(region, (0, 0), fx=2, fy=0.8)
cvshow("con", region_t)
plt.imshow(region_t)
- 图像的保存
# 第一个参数保存图片的名字,第二个是数据
cv2.imwrite("002.jpg", gray)
True
视频操作
# cv2.VideoCapture()可以捕获视频中的每一帧
vc = cv2.VideoCapture("mp4.MOV")
# isOpened()检测能否打开,vc.read()每次读取视频中的一帧,并返回一个元组:(是否读入了该帧,该帧的数据)
if vc.isOpened():
while True:
isopen, frame = vc.read()
if frame is None:
break
if isopen:
# 将BGR转换为灰度图
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("video", gray_frame)
if cv2.waitKey(30) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()