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

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 问题作为数据集。 数据点为二维输入&#xff…...

【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储

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

ZooKeeper单机、集群模式搭建教程

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

函数指针示例

目录&#xff1a; 代码&#xff1a; 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.先行课程&#xff1a;python、深度学习、数字图像处理2.查文献3.环境安装 第一章&#xff1a;概论1.计算机视觉的概念2.机器学习 第二章&#xff1a;图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示&#xff1a;图像金字…...

整数唯一分解定理

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

Grass脚本2倍速多账号

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

15分钟学 Go 第 56 天:架构设计基本原则

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