当前位置: 首页 > news >正文

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: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), 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, modelsmodel = 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):# 将图像缩放到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, axis=0)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, 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'):breakcap.release()cv2.destroyAllWindows()real_time_face_detection()

3. 总结

  • 手写数字识别: 我们通过Keras搭建一个CNN模型来训练MNIST数据集,之后使用OpenCV进行手写数字图像的实时捕捉和识别。

  • 实时人脸识别: 我们利用OpenCV的Haar级联分类器进行人脸检测,结合摄像头实现实时的面部检测。

这两个项目的代码展示了OpenCV和深度学习的结合,可以帮助理解如何使用计算机视觉和机器学习方法解决实际问题。

b. 代码优化与性能提升
  • 使用OpenCV的并行计算特性,利用CUDA加速:

    • OpenCV支持GPU加速,可以利用CUDA进行图像处理和计算。
  • 代码优化与内存管理:

    • 使用适当的数据类型、减少内存复制、尽量避免不必要的计算。

相关文章:

OpenCV基础

1. 基础入门:OpenCV概念与安装 a. OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于图像和视频处理、计算机视觉、机器学习等领域。 b. 安装OpenCV Python安装: pip in…...

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐,所以我制作了两个基础的镜像,希望可以帮助大家节省时间,你可以选择其中一种进行安装,版本说明: base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel,默认 python 版本…...

Redis做分布式锁

(一)为什么要有分布式锁以及本质 在一个分布式的系统中,会涉及到多个客户端访问同一个公共资源的问题,这时候我们就需要通过锁来做互斥控制,来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…...

lambdaQueryWrapper详细解释

LambdaQueryWrapper 是 MyBatis Plus 提供的一个强大的查询条件构建工具,它允许你使用 Lambda 表达式来构建查询条件,从而使代码更加简洁和易读。下面详细介绍 LambdaQueryWrapper 的使用方法及其底层原理。 什么是 LambdaQueryWrapper? La…...

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe ,最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题: 需要注意的是,我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …...

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt 包,但 它只会被导入一次&#x…...

理解和选择Vue的组件风格:组合式API与选项式API详解

目录 前言1. Vue 的两种组件风格概述1.1 选项式 API:直观且分块清晰1.2 组合式 API:灵活且逻辑集中 2. 深入理解组合式 API 的特点2.1 响应式变量与函数式编程2.2 逻辑组织更清晰2.3 更好的代码复用 3. 应用场景分析:如何选择 API 风格3.1 适…...

Java基础——高级技术

1. 单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1. Junit单元测试框架 可以用来对方法进行测试,他是第三方公司开源出来的(很多开发工具都已经集成了Junit框架,如IDEA&a…...

什么是SSL VPN?其中的协议结构是怎样的?

定义:SSL VPN是以SSL协议为安全基础的VPN远程接入技术,移动办公人员使用SSL VPN可以安全、方便的接入企业内网,访问企业内网资源,提高工作效率。 SSL(Security Socket Layer)是一个安全协议,为…...

程序员高频率面试题-整理篇

Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。 限流:一般是通过 Redis Lua 脚本的方式来实现限流。 消息队列&#x…...

第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字

文章目录 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字TCP设备的OPEN和USE命令关键字TCP设备的OPEN和USE命令关键字 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字 TCP设备的OPEN和USE命令关键字 可以使用位置参数(如上所述)或关键…...

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…...

Linux开发常用命令

文章目录 开发常用命令包管理 网络操作用户和权限系统监控nohup和screen的区别 开发常用命令 Linux开发中常用的命令非常多,以下是一些基本且重要的命令,这些命令对于日常的开发工作流程至关重要: 文件和目录操作 ls:列出目录内…...

Linux第92步_如何编写“设备树”下的platform设备驱动

Linux字符设备驱动,新字符设备驱动和设备树下的GPIO驱动,都是配置IO引脚所使用的GPIO寄存器,驱动开发方式和裸机没啥区别。Limux内核提供了pinctrl和gpio子系统用于GPIO驱动,借助它可简化GPIO驱动开发。 对GPIO进行读写操作&#…...

从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改

在 sophpi 中,默认网卡 eth0 的 MAC 地址未配置,是随机生成的。这样就会导致每次重启之后,MAC 地址会改变,从而导致通过 DHCP 获取 IP 地址每次也都在变化。 查看 MAC 地址 前文提到 eth0 自动使能并通过 DHCP 获取 IP 地址&…...

JMeter与大模型融合应用之JMeter日志分析服务化实战应用

JMeter与大模型融合应用之JMeter日志分析服务化 引言 在当今的互联网时代,网站和应用程序的性能直接影响到用户的体验和业务的成功。为了保证系统的稳定性和高效性,性能测试成为了软件开发过程中的一个重要环节。在这其中,Apache JMeter作为一款开源的性能测试工具,凭借其…...

AtCoder Beginner Contest 380(A-F)

比赛链接:AtCoder Beginner Contest 380(A-F) A - 123233 题意 给出一个数字 N N N,问这个数字中是否 1 1 1 恰好出现了 1 1 1 次, 2 2 2 恰好出现了 2 2 2 次, 3 3 3 恰好出现了 3 3 3 次。 数据范围 100000 ≤ N ≤ 99…...

多线程-阻塞队列

目录 阻塞队列 消息队列 阻塞队列用于生产者消费者模型 概念 实现原理 生产者消费者主要优势 缺陷 阻塞队列的实现 1.写一个普通队列 2.加上线程安全和阻塞等待 3.解决代码中的问题 阻塞队列 阻塞队列,是带有线程安全功能的队列,拥有队列先进…...

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能,只要增加 stripe 属性即可。但是如果有单元格合并的话,这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并:基于表头中的某一列,具有相同值的个数相加进行合…...

java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动

在这篇文章中,我们将学习如何使用Java编程语言模拟键盘输入,特别是模拟上下左右方向键的操作。这是一个很有趣的项目,尤其适合刚入行的开发者。我们将分步进行,接下来,我们会通过表格展示整个实现过程,然后…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...