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
[*]图像裁剪:cropped_image = image
2. 图像处置处罚:核心操纵
a. 根本操纵
[*] 灰度转换:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
[*] 图像平滑:
[*]均值滤波:cv2.blur(image, (5, 5))
[*]高斯模糊:cv2.GaussianBlur(image, (5, 5), 0)
[*] 图像锐化:
使用卷积核进行锐化:
kernel = np.array([, [-1, 5,-1], ])
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([, ])# 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()
# 数据预处理:将像素值缩放到
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
# 预处理图像
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进行图像处置处罚和盘算。
[*] 代码优化与内存管理:
[*]使用适当的数据范例、镌汰内存复制、只管制止不须要的盘算。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]