1、读取和显示图像
使用opencv之前需要安装OpenCv
pip install opencv-python
图像的读取
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 图像的保存, 第一个是路径, 后面的是要保存的图像
cv2.imwrite("d:\img", image)
# 改变显示窗口的大小
"""
windowName: 这是要调整大小的窗口的名称,通常是通过 cv2.namedWindow() 函数创建的窗口的名称。
width: 这是要设置的窗口的新宽度,以像素为单位。
height: 这是要设置的窗口的新高度,以像素为单位。
"""
cv.resizeWindow(windowName, width, height)
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、图像的缩放和裁剪
[y1:y2, x1:x2] 代表了左上角和右下角的坐标
# 缩放图像
resized_image = cv2.resize(image, (width, height))
# 裁剪图像
cropped_image = image[y1:y2, x1:x2]
3、图像的平移、旋转、透视
见代码
# 平移
img = cv2.imread("hu.png") # 读取图像
h, w, _ = img.shape # 获取图像的高度和宽度
# 创建平移矩阵 M,其中 (50, 100) 是 X 和 Y 轴上的平移量
M = np.float32([[1, 0, 50], [0, 1, 100]])
img = cv2.warpAffine(img, M, (w, h)) # 应用平移变换
cv2.imshow("12", img) # 显示结果图像
cv2.waitKey() # 等待用户按下任意键后关闭窗口
# 旋转
img = cv2.imread("hu.png") # 读取图像
h, w, _ = img.shape # 获取图像的高度和宽度
center = (h // 2, w // 2) # 计算图像中心坐标
# 创建旋转矩阵 M,其中 (center, 30, 0.8) 表示旋转角度为30度,缩放比例为0.8
M = cv2.getRotationMatrix2D(center, 30, 0.8)
img = cv2.warpAffine(img, M, (w, h)) # 应用旋转变换
cv2.imshow("", img) # 显示结果图像
cv2.waitKey() # 等待用户按下任意键后关闭窗口
# 透视
img = cv2.imread("../day01/2333333.jpg") # 读取图像
h, w, _ = img.shape # 获取图像的高度和宽度
# 定义原图的四个点坐标 p1 和透视后的四个点坐标 p2
p1 = np.zeros((4, 2), np.float32)
p1[0] = [0, 0]
p1[1] = [w, 0]
p1[2] = [0, h]
p1[3] = [w, h]
p2 = np.zeros((4, 2), np.float32)
p2[0] = [600, 0]
p2[1] = [w - 600, 0]
p2[2] = [400, h]
p2[3] = [w - 400, h]
# 获取透视变换矩阵 M
M = cv2.getPerspectiveTransform(p1, p2)
img = cv2.warpPerspective(img, M, (w, h)) # 应用透视变换
cv2.imshow("", img) # 显示结果图像
cv2.resize(img, (600, 400)) # 调整图像大小(但未保存结果)
cv2.waitKey() # 等待用户按下任意键后关闭窗口
4、图像滤波和边缘检测
(kernel_size, kernel_size) 是滤波核的大小,也称为卷积核或窗口大小。均值滤波核是一个正方形的矩阵,其大小由(kernel_size, kernel_size)指定,通常是一个奇数值,例如3x3、5x5等。滤波核的大小决定了滤波的程度,更大的核会导致更强烈的模糊效果。
# 高斯滤波
blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
# 均值滤波
blurred_image = cv2.blur(image, (kernel_size, kernel_size))
OpenCV 提供了多种边缘检测算法,其中最常用的是Canny边缘检测算法
import cv2
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像
# 使用Canny边缘检测
# threshold1和threshold2是Canny算法的阈值,用于控制边缘检测的灵敏度。根据应用需求,你可以调整这两个阈值来获取适当的边缘检测结果。
edges = cv2.Canny(image, threshold1, threshold2)
# 显示原始图像和边缘图像
cv2.imshow('Original Image', image)
cv2.imshow('Edge Detection', edges)
# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
5、腐蚀和膨胀
腐蚀 : 腐蚀操作可以缩小物体的边界,去除小的噪声点,以及分离连接的物体
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模��读取图像
# 定义腐蚀核(结构元素)
kernel = np.ones((5, 5), np.uint8)
# 腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)
# 显示原始图像和腐蚀后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Eroded Image', eroded_image)
# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀 :膨胀操作可以增加物体的边界,填充小的空洞,以及连接接近的物体
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像
# 定义膨胀核(结构元素)
kernel = np.ones((5, 5), np.uint8)
# 膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)
# 显示原始图像和膨胀后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
# 等待用户按下任意键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
6、图像转换
HSV颜色空间 是一种用于表示图像中颜色的方式。HSV颜色空间是一种常用的颜色表示方式,它包括以下三个分量:
色相(H): 表示颜色的种类,通常以角度度量。0度对应红色,120度对应绿色,240度对应蓝色,等等。
饱和度(S): 表示颜色的饱和度或纯度。饱和度为0表示灰度图像,饱和度为1表示完全饱和的颜色。
亮度(V): 表示颜色的亮度。0表示黑色,1表示白色。
# 灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 转HSV颜色空间
img = cv2.imread("234.jpg")
# 把图片冲BGR空间装换为HSV空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 设定要过滤的颜色范围的下界和上界阈值 (这里设定为紫色范围)
#上下限
low_hsv = np.array([125, 43, 46])
hign_hsv = np.array([155, 255, 255])
# 根据设定的颜色阈值,创建掩膜(将符合条件的像素设为白色,不符合条件的设为黑色)
mask1 = cv2.inRange(hsv, lowerb=low_hsv, upperb=hign_hsv)
cv2.imshow("",mask1)
# 将原始图片与提取出的颜色部分进行按位与操作,得到提取出的颜色部分
color = cv2.bitwise_and(img, img, mask=mask1)
# cv2.imshow("", color)
cv2.waitKey()
7、视频读取
cv2.VideoCapture 可以捕获摄像头,视频文件的话,直接指定好路径就行
import cv2
# 读取视频
video = cv2.VideoCapture("./demo.mp4")
# 检查打开是否正确
if video.isOpened():
# video.read() 一帧一帧地读取,即一张图像一张图像的读取
# frame 得到当前这一帧的图像
open, frame = video.read()
else:
open = False
# 当视频进行读取时
while open:
ret, frame = video.read()
# 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
if frame is None:
break
if ret == True:
# 转换为灰度图,这里COLOR_BGR2GRAY表示转为灰度图,想要其他的就用其他的就行
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("video",gray)
# 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
# 这里等于 27 也即是说按下 ESC 键即可退出该窗口
if cv2.waitKey(10) & 0xFF == 27:
break
video.release()
cv2.destroyAllWindows()
8、目标检测:人脸检测
以下代码使用Haar级联分类器来检测人脸,并做了贴图操作
import cv2
# 读取视频
cap = cv2.VideoCapture("18f.mp4")
# 读取图片
img = cv2.imread("fensi.png", 1)
# 获得视频帧的宽度和高度
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建VideoWriter以保存输出视频
out = cv2.VideoWriter("1.avi", cv2.VideoWriter_fourcc("M", "J", "P", "G"), cap.get(cv2.CAP_PROP_FPS), (w, h))
# 初始化人脸级联分类器
classifier = cv2.CascadeClassifier()
# 加载预训练的人脸级联分类器
classifier.load(r"haarcascade_frontalface_default.xml")
# 遍历视频的每一帧
while cap.isOpened():
# 读取当前帧
r, frame = cap.read()
if not r:
# 如果没有读取到帧(视频结束),跳出循环
break
# 将帧转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 在帧中检测人脸
faces = classifier.detectMultiScale(gray)
for x, y, w, h in faces:
# 在人脸周围绘制红色矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 将帧和logo调整到与检测到的人脸矩形相同的尺寸
frame_h, frame_w, _ = frame.shape
re_frame_h, re_frame_w, _ = img.shape
new_h = int(h * frame_h / re_frame_h)
new_w = int(w * frame_w / re_frame_w)
logo = cv2.resize(img, (new_w, new_h))
try:
# 在人脸区域上覆盖logo
frame[y - new_h:y, x + 10:x + 10 + new_w] = logo
except:
pass
continue
# 显示带有人脸检测结果的帧
cv2.imshow("", frame)
# 将帧写入输出视频
out.write(frame)
# 如果按下空格键,跳出循环
if cv2.waitKey(20) & 0XFF == ord(" "):
break
# 释放视频捕获和视频写入对象,关闭窗口
out.release()
cap.release()
cv2.destroyAllWindows()