马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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)
复制代码 - 图像边缘检测:
- 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:导入须要的库
步骤 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企服之家,中国第一个企服评测及商务社交产业平台。 |