品牌网站建设小8a蝌蚪,wordpress小说站,crm系统永久免费,建个好网站1. 基础入门#xff1a;OpenCV概念与安装
a. OpenCV简介
OpenCV#xff08;Open Source Computer Vision Library#xff09;是一个开源的计算机视觉库#xff0c;广泛应用于图像和视频处理、计算机视觉、机器学习等领域。
b. 安装OpenCV Python安装#xff1a; pip in…1. 基础入门OpenCV概念与安装
a. OpenCV简介
OpenCVOpen 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平移100y平移50
translated_image cv2.warpAffine(image, M, (cols, rows))c. 形态学操作 膨胀与腐蚀 kernel np.ones((5,5), np.uint8)
dilated cv2.dilate(image, kernel, iterations1)
eroded cv2.erode(image, kernel, iterations1)开运算与闭运算 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, scaleFactor1.1, minNeighbors5, minSize(30, 30))HOGHistogram 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:breakcv2.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), swapRBTrue, cropFalse)
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 kerasimport 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, modelsmodel models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activationrelu))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activationrelu))
model.add(layers.Flatten())
model.add(layers.Dense(64, activationrelu))
model.add(layers.Dense(10, activationsoftmax))model.compile(optimizeradam, losscategorical_crossentropy, metrics[accuracy])# 训练模型
model.fit(x_train, y_train, epochs5, batch_size64, validation_data(x_test, y_test))步骤 4保存和加载训练好的模型
训练完成后保存模型。
model.save(mnist_model.h5)加载模型在实际应用中使用时会加载模型。
model load_model(mnist_model.h5)步骤 5手写数字识别预测部分
这里使用OpenCV获取用户输入的手写数字进行预测。
def preprocess_image(image):# 将图像缩放到28x28image 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, axis0)return imagedef 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):breakcap.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, scaleFactor1.1, minNeighbors5, minSize(30, 30))# 在检测到的每一张人脸上画一个矩形框for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2)# 显示带有矩形框的图像cv2.imshow(Real-time Face Detection, frame)# 按 q 键退出if cv2.waitKey(1) 0xFF ord(q):breakcap.release()cv2.destroyAllWindows()real_time_face_detection()3. 总结 手写数字识别 我们通过Keras搭建一个CNN模型来训练MNIST数据集之后使用OpenCV进行手写数字图像的实时捕捉和识别。 实时人脸识别 我们利用OpenCV的Haar级联分类器进行人脸检测结合摄像头实现实时的面部检测。
这两个项目的代码展示了OpenCV和深度学习的结合可以帮助理解如何使用计算机视觉和机器学习方法解决实际问题。
b. 代码优化与性能提升 使用OpenCV的并行计算特性利用CUDA加速 OpenCV支持GPU加速可以利用CUDA进行图像处理和计算。 代码优化与内存管理 使用适当的数据类型、减少内存复制、尽量避免不必要的计算。