自学内容网 自学内容网

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)!