OpenCV底子

打印 上一主题 下一主题

主题 1049|帖子 1049|积分 3147

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 底子入门:OpenCV概念与安装

a. OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的盘算机视觉库,广泛应用于图像和视频处置处罚、盘算机视觉、机器学习等范畴。
b. 安装OpenCV



  • Python安装:
    1. pip install opencv-python
    2. pip install opencv-python-headless  # 如果不需要GUI功能
    复制代码
  • C++安装:
    你可以参考OpenCV官网提供的安装指南,进行从源码编译或使用预编译的库进行安装。
c. OpenCV根本布局



  • 读取与表现图像:
    使用cv2.imread()读取图像,cv2.imshow()表现图像,cv2.waitKey()暂停,cv2.destroyAllWindows()关闭窗口。
    1. import cv2
    2. image = cv2.imread('image.jpg')
    3. cv2.imshow('Image', image)
    4. cv2.waitKey(0)
    5. cv2.destroyAllWindows()
    复制代码
  • 生存图像:
    1. cv2.imwrite('output.jpg', image)
    复制代码
  • 底子图像操纵:

    • 获取图像尺寸:image.shape
    • 访问图像像素:image[y, x]
    • 图像裁剪:cropped_image = image[y1:y2, x1:x2]

2. 图像处置处罚:核心操纵

a. 根本操纵



  • 灰度转换:
    1. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    复制代码
  • 图像平滑:

    • 均值滤波:cv2.blur(image, (5, 5))
    • 高斯模糊:cv2.GaussianBlur(image, (5, 5), 0)

  • 图像锐化:
    使用卷积核进行锐化:
    1. kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
    2. sharpened = cv2.filter2D(image, -1, kernel)
    复制代码
  • 图像边缘检测:

    • Canny边缘检测:
    1. edges = cv2.Canny(image, 100, 200)
    复制代码

b. 图像变换



  • 旋转、缩放、平移:
    1. # 旋转
    2. rows, cols = image.shape[:2]
    3. M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
    4. rotated_image = cv2.warpAffine(image, M, (cols, rows))
    5. # 缩放
    6. resized_image = cv2.resize(image, (width, height))
    7. # 平移
    8. M = np.float32([[1, 0, 100], [0, 1, 50]])  # x平移100,y平移50
    9. translated_image = cv2.warpAffine(image, M, (cols, rows))
    复制代码
c. 形态学操纵



  • 膨胀与腐蚀:
    1. kernel = np.ones((5,5), np.uint8)
    2. dilated = cv2.dilate(image, kernel, iterations=1)
    3. eroded = cv2.erode(image, kernel, iterations=1)
    复制代码
  • 开运算与闭运算:
    1. opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
    2. closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
    复制代码
3. 高级应用与盘算机视觉

a. 特性提取与匹配



  • 边缘检测与外貌提取:
    1. contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    2. cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
    复制代码
  • Harris角点检测:
    1. gray = np.float32(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY))
    2. dst = cv2.cornerHarris(gray, 2, 3, 0.04)
    复制代码
  • SURF/SIFT特性匹配:(需要安装额外的包)
    1. sift = cv2.SIFT_create()
    2. keypoints, descriptors = sift.detectAndCompute(image, None)
    复制代码
b. 目的检测与辨认



  • 人脸检测:
    1. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    2. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    复制代码
  • HOG(Histogram of Oriented Gradients)行人检测:
    1. hog = cv2.HOGDescriptor()
    2. hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
    3. boxes, weights = hog.detectMultiScale(image)
    复制代码
c. 视频处置处罚



  • 视频读取与写入:
    1. cap = cv2.VideoCapture('video.mp4')
    2. while(cap.isOpened()):
    3.     ret, frame = cap.read()
    4.     if not ret:
    5.         break
    6.     cv2.imshow('Frame', frame)
    7.     if cv2.waitKey(1) & 0xFF == ord('q'):
    8.         break
    9. cap.release()
    10. cv2.destroyAllWindows()
    复制代码
  • 背景减除:
    使用cv2.createBackgroundSubtractorMOG2()或cv2.createBackgroundSubtractorKNN()进行动态场景分析。
4. 进阶:机器学习与深度学习

a. 盘算机视觉中的机器学习



  • OpenCV有一些内置的机器学习算法,如支持向量机(SVM)、k-近邻(KNN)、决策树等。
  • 通过使用cv2.ml模块,您可以实现根本的机器学习任务,如分类、回归和聚类。
b. OpenCV与深度学习结合



  • 深度学习模子加载: OpenCV可以加载深度学习框架训练的模子,比方TensorFlow、PyTorch等:
    1. net = cv2.dnn.readNet('model.onnx')
    复制代码
  • 推理与物体检测:
    使用深度学习模子进行物体辨认和语义分割。
    1. blob = cv2.dnn.blobFromImage(image, 1.0, (width, height), (0, 0, 0), swapRB=True, crop=False)
    2. net.setInput(blob)
    3. output = net.forward()
    复制代码
5. 项目实践:

a. 综合项目



  • 手写数字辨认(MNIST):
    使用OpenCV结合机器学习或深度学习方法进行手写数字识别。

  • 实时人脸辨认:
    结合人脸检测、面部关键点检测与表情辨认。
1. 手写数字辨认(MNIST)

  1. 使用OpenCV结合机器学习或深度学习方法进行手写数字识别。
复制代码
手写数字辨认任务通常使用经典的MNIST数据集,它包罗了28x28像素的手写数字图像。
实现步骤:

步骤 1:导入须要的库

首先需要安装和导入一些须要的库。
  1. pip install opencv-python opencv-python-headless numpy tensorflow keras
复制代码
  1. import cv2
  2. import numpy as np
  3. import tensorflow as tf
  4. from tensorflow.keras.models import load_model
  5. from tensorflow.keras.datasets import mnist
复制代码
步骤 2:加载MNIST数据集

MNIST数据集可以通过Keras加载,用于训练我们的模子。
  1. # 加载MNIST数据集
  2. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  3. # 数据预处理:将像素值缩放到[0, 1]
  4. x_train = x_train.astype('float32') / 255
  5. x_test = x_test.astype('float32') / 255
  6. # 重新调整数据的维度,以适应模型输入
  7. x_train = np.expand_dims(x_train, axis=-1)
  8. x_test = np.expand_dims(x_test, axis=-1)
  9. # 将标签转化为one-hot编码
  10. from tensorflow.keras.utils import to_categorical
  11. y_train = to_categorical(y_train, 10)
  12. y_test = to_categorical(y_test, 10)
复制代码
步骤 3:创建和训练模子

我们将使用一个简单的卷积神经网络(CNN)来训练手写数字辨认模子。
  1. from tensorflow.keras import layers, models
  2. model = models.Sequential()
  3. model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
  4. model.add(layers.MaxPooling2D((2, 2)))
  5. model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  6. model.add(layers.MaxPooling2D((2, 2)))
  7. model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  8. model.add(layers.Flatten())
  9. model.add(layers.Dense(64, activation='relu'))
  10. model.add(layers.Dense(10, activation='softmax'))
  11. model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
  12. # 训练模型
  13. model.fit(x_train, y_train, epochs=5, batch_size=64, validation_data=(x_test, y_test))
复制代码
步骤 4:生存和加载训练好的模子

训练完成后,生存模子。
  1. model.save('mnist_model.h5')
复制代码
加载模子(在实际应用中使用时会加载模子)。
  1. model = load_model('mnist_model.h5')
复制代码
步骤 5:手写数字辨认(预测部分)

这里使用OpenCV获取用户输入的手写数字进行预测。
  1. def preprocess_image(image):
  2.     # 将图像缩放到28x28
  3.     image = cv2.resize(image, (28, 28))
  4.     # 转为灰度图
  5.     image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  6.     # 反转颜色(白底黑字)
  7.     image = cv2.bitwise_not(image)
  8.     # 归一化
  9.     image = image / 255.0
  10.     # 调整维度,模型输入需要的形状是 (1, 28, 28, 1)
  11.     image = np.expand_dims(image, axis=-1)
  12.     image = np.expand_dims(image, axis=0)
  13.     return image
  14. def recognize_digit():
  15.     # 打开摄像头
  16.     cap = cv2.VideoCapture(0)
  17.     while True:
  18.         ret, frame = cap.read()
  19.         if not ret:
  20.             break
  21.         # 画一个矩形框作为手写区域
  22.         cv2.rectangle(frame, (100, 100), (300, 300), (0, 255, 0), 2)
  23.         roi = frame[100:300, 100:300]
  24.         
  25.         # 预处理图像
  26.         preprocessed_image = preprocess_image(roi)
  27.         # 预测
  28.         prediction = model.predict(preprocessed_image)
  29.         digit = np.argmax(prediction)
  30.         # 在图像上显示预测的数字
  31.         cv2.putText(frame, str(digit), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
  32.         cv2.imshow("Handwritten Digit Recognition", frame)
  33.         # 按 'q' 键退出
  34.         if cv2.waitKey(1) & 0xFF == ord('q'):
  35.             break
  36.     cap.release()
  37.     cv2.destroyAllWindows()
  38. recognize_digit()
复制代码

2. 实时人脸辨认项目

这个项目使用OpenCV的Haar级联分类器来进行人脸检测。
实现步骤:

步骤 1:导入须要的库

  1. import cv2
复制代码
步骤 2:加载人脸检测器

OpenCV提供了一个预训练的Haar级联分类器模子,可以用于人脸检测。
  1. # 加载Haar级联分类器(人脸检测)
  2. face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
复制代码
步骤 3:实时人脸检测

我们使用摄像头捕捉实时视频流,并在检测到的人脸区域附近画矩形框。
  1. def real_time_face_detection():
  2.     # 打开摄像头
  3.     cap = cv2.VideoCapture(0)
  4.     while True:
  5.         ret, frame = cap.read()
  6.         if not ret:
  7.             break
  8.         # 转为灰度图,因为人脸检测是基于灰度图进行的
  9.         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  10.         # 检测人脸
  11.         faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  12.         # 在检测到的每一张人脸上画一个矩形框
  13.         for (x, y, w, h) in faces:
  14.             cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
  15.         # 显示带有矩形框的图像
  16.         cv2.imshow('Real-time Face Detection', frame)
  17.         # 按 'q' 键退出
  18.         if cv2.waitKey(1) & 0xFF == ord('q'):
  19.             break
  20.     cap.release()
  21.     cv2.destroyAllWindows()
  22. real_time_face_detection()
复制代码
3. 总结



  • 手写数字辨认: 我们通过Keras搭建一个CNN模子来训练MNIST数据集,之后使用OpenCV进行手写数字图像的实时捕捉和辨认。
  • 实时人脸辨认: 我们使用OpenCV的Haar级联分类器进行人脸检测,结合摄像头实现实时的面部检测。
这两个项目的代码展示了OpenCV和深度学习的结合,可以帮助明白怎样使用盘算机视觉和机器学习方法解决实际问题。
b. 代码优化与性能提升



  • 使用OpenCV的并行盘算特性,使用CUDA加快:

    • OpenCV支持GPU加快,可以使用CUDA进行图像处置处罚和盘算。

  • 代码优化与内存管理:

    • 使用适当的数据范例、镌汰内存复制、只管制止不须要的盘算。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表