使用OpenCV读取视频、图片并做简单处理

1.OpenCV的安装与卸载

在conda中安装opencv,打开Anaconda Prompt 使用国内镜像源安装opencv,命令如下:

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

也可以安装opencv的另一个扩展包opencv-contrib-python,不安装扩展包也可以使用,命令如下:

pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

卸载opencv,使用命令

pip uninstall opencv-python

Pycharm中没有cv2库的提示时,找到cv2安装的路径,将虚拟环境中的site-packages\cv2中的cv2.pyd复制一份到site-packages(也就是上一级目录),重启一下pycharm就可以了。解决pycharm中的cv2库没有提示的问题(Python3+win10+opencv-python 4.6.0.66)icon-default.png?t=MBR7https://blog.csdn.net/weixin_43490422/article/details/127091826

2.视频、图片的处理

需要引用以下库

import numpy as np
import cv2
import matplotlib.pyplot as plt
import pylab
img0 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]])

print(img0.shape)  # 打印img0的行数和列数

plt.imshow(img0, cmap = 'gray')
pylab.show()  # 需要此语句来调用显示

使用VideoCaptuure命令读取图像

# 从视频中读取图像,"01.mp4"可换为视频的绝对路径
cap = cv2.VideoCapture("01.mp4")
# 从摄像头中读取图像
cap = cv2.VideoCapture(0)

通过cap.isOpened()判断是否提取成功

print(cap.isOpened())

返回Ture则提取成功,返回Fluse则没有提取成功

# 读取视频中的一帧
return_value, frame = cap.read()
# 显示视频中的图像
plt.imshow(frame)
pylab.show()

改变读取视频画面或者图片颜色通道的各种方法

# 使用cv2.COLOR_BGR2RGB方法变换RGB三个通道的顺序
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
# 将图片中的RGB三通道变为灰度通道
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY))
# 将RGB图片转换为HSV
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2HSV))
# 将图片二值化显示
img = cv2.imread("02.jpg")
_, img_bw = cv2.threshold(img,128,200,cv2.THRESH_BINARY)
plt.imshow(img_bw)
print(img_bw)

pylab.show()

图像的大小和缩放

# 图像的放大与缩小 ,宽|高
img = cv2.resize(img, (500, 300))
plt.imshow(img)
pylab.show()

roi:图像的截取

# roi:截取部分图片
img_roi = img[100:300, 0:200]
plt.imshow(img_roi)
pylab.show()

Affine变换:移动、缩放、旋转、拉伸

# 读取图片
img = cv2.imread("02.jpg")
# Affine变换:移动tx = 300,ty = 200,m为变换矩阵
# Affine缩放:x缩放 = 1,y缩放 = 2
m = np.float32([[1,0,300],[0, 2, 200]])  # m为变换矩阵
img_m = cv2.warpAffine(img, m, (500, 1000))  # 底图大小(500,1000)
plt.imshow(img_m)
pylab.show()

# Affine旋转:theta(弧度,180/3.14) ,move_x = x轴右移值,move_y = y轴下移值
theta = 0.5
move_x = 100
move_y = 50
m = np.float32([[np.cos(theta), -np.sin(theta), move_x], [np.sin(theta), np.cos(theta), move_y]])
cols = 800  # 底图宽度
rows = 500  # 底图高度
img_dst = cv2.warpAffine(img,m,(cols,rows))
plt.imshow(img_dst)
pylab.show()

# Affine拉伸:src = 源图像四边形顶点坐标 ;dst = 目标图像对应的四边形顶点坐标
src = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
dst = np.float32([[0, 0], [100, 0], [0, 300], [300, 300]])
m = cv2.getPerspectiveTransform(src, dst)  #通过src、dst计算得到变换矩阵
cols = 800  # 底图宽度
rows = 500  # 底图高度
img_dst = cv2.warpPerspective(img, m, (cols, rows))
plt.imshow(img_dst)
pylab.show()
图像模糊与锐化,高斯模糊类似于将图像梯度变平滑
# 读取图片
img = cv2.imread("02.jpg")
# 图像的模糊
img = cv2.GaussianBlur(img, (49, 49), 1, 0)  # 高斯模糊
pylab.show()

# 图像的锐化
kernel = np.ones((3, 3), np.float32) / 8
kernel = -kernel
kernel[0, :] = [-1, -1, -1]
kernel[1, :] = [0, 0, 0]
kernel[2, :] = [1, 1, 1]

result = cv2.filter2D(img, -1, kernel)
print(result.shape)
print(result[0, 0])
plt.imshow(result * 500)
pylab.show()

求图中图像的边缘

# 读取图片
img = cv2.imread("02.jpg")
# 求边缘
img_b = cv2.Canny(img,30,150)
plt.imshow(img_b)
pylab.show()

加水印

# 加水印,"watermask1.png"为水印图片
wm = cv2.imread("watermask1.png")
wm = cv2.resize(wm, (300, 300))
wm = 255 - wm
img1 = cv2.resize(img, (300, 300))
print(wm.shape)
plt.imshow(cv2.addWeighted(wm, 0.9, img1, 1, 0))  # 通过调节addWeighted函数权重可以调节图片亮度

pylab.show()

3.释放资源

在使用摄像头后及时释放,可以减小程序的内存消耗,提高运行流畅度

# 打印frame的形状
print(frame.shape)
# 释放摄像头
cap.release()
# 截图图像中的部分区域
roi = frame[100:400, 200:500]
plt.imshow(roi)
pylab.show()

你可能感兴趣的:(OpenCV,opencv,python)