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编程语言模拟键盘输入,特别是模拟上下左右方向键的操作。这是一个很有趣的项目,尤其适合刚入行的开发者。我们将分步进行,接下来,我们会通过表格展示整个实现过程,然后…...

SDF,一个从1978年运行至今的公共Unix Shell
关于SDF 最近发现了一个很古老的公共Unix Shell服务器,这个项目从1978年运行至今,如果对操作系统,对Unix感兴趣,可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…...

前馈神经网络 (Feedforward Neural Network, FNN)
代码功能 网络定义: 使用 torch.nn 构建了一个简单的前馈神经网络。 隐藏层使用 ReLU 激活函数,输出层使用 Sigmoid 函数(适用于二分类问题)。 数据生成: 使用经典的 XOR 问题作为数据集。 数据点为二维输入ÿ…...

【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
1、数据持久化与访问效率 数据持久化是指程序运行过程中产生的数据能够长期保存,即使程序关闭或系统重启后仍可读取和修改。通过数据库,我们可以确保数据持久化的同时,实现数据的快速访问。例如,银行系统需要实时更新账户余额&am…...

ZooKeeper单机、集群模式搭建教程
单点配置 ZooKeeper在启动的时候,默认会读取/conf/zoo.cfg配置文件,该文件缺失会报错。因此,我们需要在将容器/conf/挂载出来,在制定的目录下,添加zoo.cfg文件。 zoo.cfg logback.xml 配置文件的信息可以从二进制包…...

函数指针示例
目录: 代码: main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…...

vue如何实现组件切换
一、使用条件渲染 (v-if) <template><div><button click"currentView ComponentA">Show Component A</button><button click"currentView ComponentB">Show Component B</button><component-a v-if"curren…...

计算机视觉 1-8章 (硕士)
文章目录 零、前言1.先行课程:python、深度学习、数字图像处理2.查文献3.环境安装 第一章:概论1.计算机视觉的概念2.机器学习 第二章:图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示:图像金字…...

整数唯一分解定理
整数唯一分解定理,也称为算术基本定理,是由德国数学家高斯在其著作《算术研究》中首次提出的。本文回顾整数唯一分解定理以及对应的几个重要结论。 一、整数唯一分解定理 整数唯一分解定理,也称为算术基本定理,是数论中的一个重…...

Grass脚本2倍速多账号
前言,小编也是第一次撸空投,我是抱着试一试的态度,梦想总是要有的万一白嫖了呢 Grass 是什么? Grass 扩展程序是一款创新的工具,它可以帮助您释放未使用的网络资源的力量。 通过分享您的剩余带宽,您可以赚…...

15分钟学 Go 第 56 天:架构设计基本原则
第56天:架构设计基本原则 学习目标 理解和掌握基本的架构设计原则,以提升软件系统的可维护性、可扩展性和可重用性。 内容提纲 架构设计原则概述常见架构设计原则 单一职责原则 (SRP)开放/封闭原则 (OCP)里氏替换原则 (LSP)接口分离原则 (ISP)依赖反…...