OpenCV基础
1. 基础入门:OpenCV概念与安装
a. OpenCV简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于图像和视频处理、计算机视觉、机器学习等领域。
b. 安装OpenCV
-
Python安装:
pip install opencv-python pip install opencv-python-headless # 如果不需要GUI功能
-
C++安装:
你可以参考OpenCV官网提供的安装指南,进行从源码编译或使用预编译的库进行安装。
c. OpenCV基本结构
-
读取与显示图像:
使用cv2.imread()
读取图像,cv2.imshow()
显示图像,cv2.waitKey()
暂停,cv2.destroyAllWindows()
关闭窗口。import cv2 image = cv2.imread('image.jpg') cv2.imshow('Image', image) cv2.waitKey(0) cv2.destroyAllWindows()
-
保存图像:
cv2.imwrite('output.jpg', image)
-
基础图像操作:
- 获取图像尺寸:
image.shape
- 访问图像像素:
image[y, x]
- 图像裁剪:
cropped_image = image[y1:y2, x1:x2]
- 获取图像尺寸:
2. 图像处理:核心操作
a. 基本操作
-
灰度转换:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
图像平滑:
- 均值滤波:
cv2.blur(image, (5, 5))
- 高斯模糊:
cv2.GaussianBlur(image, (5, 5), 0)
- 均值滤波:
-
图像锐化:
使用卷积核进行锐化:kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]]) sharpened = cv2.filter2D(image, -1, kernel)
-
图像边缘检测:
- Canny边缘检测:
edges = cv2.Canny(image, 100, 200)
b. 图像变换
- 旋转、缩放、平移:
# 旋转 rows, cols = image.shape[:2] M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1) rotated_image = cv2.warpAffine(image, M, (cols, rows)) # 缩放 resized_image = cv2.resize(image, (width, height)) # 平移 M = np.float32([[1, 0, 100], [0, 1, 50]]) # x平移100,y平移50 translated_image = cv2.warpAffine(image, M, (cols, rows))
c. 形态学操作
-
膨胀与腐蚀:
kernel = np.ones((5,5), np.uint8) dilated = cv2.dilate(image, kernel, iterations=1) eroded = cv2.erode(image, kernel, iterations=1)
-
开运算与闭运算:
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
3. 高级应用与计算机视觉
a. 特征提取与匹配
-
边缘检测与轮廓提取:
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
-
Harris角点检测:
gray = np.float32(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)) dst = cv2.cornerHarris(gray, 2, 3, 0.04)
-
SURF/SIFT特征匹配:(需要安装额外的包)
sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(image, None)
b. 目标检测与识别
-
人脸检测:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
-
HOG(Histogram of Oriented Gradients)行人检测:
hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) boxes, weights = hog.detectMultiScale(image)
c. 视频处理
-
视频读取与写入:
cap = cv2.VideoCapture('video.mp4') while(cap.isOpened()): ret, frame = cap.read() if not ret: break cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
-
背景减除:
使用cv2.createBackgroundSubtractorMOG2()
或cv2.createBackgroundSubtractorKNN()
进行动态场景分析。
4. 进阶:机器学习与深度学习
a. 计算机视觉中的机器学习
-
OpenCV有一些内置的机器学习算法,如支持向量机(SVM)、k-近邻(KNN)、决策树等。
-
通过使用
cv2.ml
模块,您可以实现基本的机器学习任务,如分类、回归和聚类。
b. OpenCV与深度学习结合
-
深度学习模型加载: OpenCV可以加载深度学习框架训练的模型,例如TensorFlow、PyTorch等:
net = cv2.dnn.readNet('model.onnx')
-
推理与物体检测:
使用深度学习模型进行物体识别和语义分割。blob = cv2.dnn.blobFromImage(image, 1.0, (width, height), (0, 0, 0), swapRB=True, crop=False) net.setInput(blob) output = net.forward()
5. 项目实践:
a. 综合项目
-
手写数字识别(MNIST):
使用OpenCV结合机器学习或深度学习方法进行手写数字识别。 -
实时人脸识别:
结合人脸检测、面部关键点检测与表情识别。
1. 手写数字识别(MNIST)
使用OpenCV结合机器学习或深度学习方法进行手写数字识别。
手写数字识别任务通常使用经典的MNIST数据集,它包含了28x28像素的手写数字图像。
实现步骤:
步骤 1:导入必要的库
首先需要安装和导入一些必要的库。
pip install opencv-python opencv-python-headless numpy tensorflow keras
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.datasets import mnist
步骤 2:加载MNIST数据集
MNIST数据集可以通过Keras加载,用于训练我们的模型。
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 数据预处理:将像素值缩放到[0, 1]
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
# 重新调整数据的维度,以适应模型输入
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
# 将标签转化为one-hot编码
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
步骤 3:创建和训练模型
我们将使用一个简单的卷积神经网络(CNN)来训练手写数字识别模型。
from tensorflow.keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_data=(x_test, y_test))
步骤 4:保存和加载训练好的模型
训练完成后,保存模型。
model.save('mnist_model.h5')
加载模型(在实际应用中使用时会加载模型)。
model = load_model('mnist_model.h5')
步骤 5:手写数字识别(预测部分)
这里使用OpenCV获取用户输入的手写数字进行预测。
def preprocess_image(image):
# 将图像缩放到28x28
image = cv2.resize(image, (28, 28))
# 转为灰度图
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 反转颜色(白底黑字)
image = cv2.bitwise_not(image)
# 归一化
image = image / 255.0
# 调整维度,模型输入需要的形状是 (1, 28, 28, 1)
image = np.expand_dims(image, axis=-1)
image = np.expand_dims(image, axis=0)
return image
def recognize_digit():
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 画一个矩形框作为手写区域
cv2.rectangle(frame, (100, 100), (300, 300), (0, 255, 0), 2)
roi = frame[100:300, 100:300]
# 预处理图像
preprocessed_image = preprocess_image(roi)
# 预测
prediction = model.predict(preprocessed_image)
digit = np.argmax(prediction)
# 在图像上显示预测的数字
cv2.putText(frame, str(digit), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
cv2.imshow("Handwritten Digit Recognition", frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
recognize_digit()
2. 实时人脸识别项目
这个项目使用OpenCV的Haar级联分类器来进行人脸检测。
实现步骤:
步骤 1:导入必要的库
import cv2
步骤 2:加载人脸检测器
OpenCV提供了一个预训练的Haar级联分类器模型,可以用于人脸检测。
# 加载Haar级联分类器(人脸检测)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
步骤 3:实时人脸检测
我们使用摄像头捕捉实时视频流,并在检测到的人脸区域周围画矩形框。
def real_time_face_detection():
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 转为灰度图,因为人脸检测是基于灰度图进行的
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 在检测到的每一张人脸上画一个矩形框
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示带有矩形框的图像
cv2.imshow('Real-time Face Detection', frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
real_time_face_detection()
3. 总结
-
手写数字识别: 我们通过Keras搭建一个CNN模型来训练MNIST数据集,之后使用OpenCV进行手写数字图像的实时捕捉和识别。
-
实时人脸识别: 我们利用OpenCV的Haar级联分类器进行人脸检测,结合摄像头实现实时的面部检测。
这两个项目的代码展示了OpenCV和深度学习的结合,可以帮助理解如何使用计算机视觉和机器学习方法解决实际问题。
b. 代码优化与性能提升
-
使用OpenCV的并行计算特性,利用CUDA加速:
- OpenCV支持GPU加速,可以利用CUDA进行图像处理和计算。
-
代码优化与内存管理:
- 使用适当的数据类型、减少内存复制、尽量避免不必要的计算。
原文地址:https://blog.csdn.net/CSBLOG/article/details/143824544
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!