计算机视觉基础:OpenCV库详解
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》
计算机视觉基础:OpenCV库详解
- 计算机视觉基础:OpenCV库详解
- 引言
- OpenCV 概述
- 什么是 OpenCV
- OpenCV 的应用场景
- 安装和配置 OpenCV
- 安装 OpenCV
- 验证安装
- OpenCV 基础
- 读取和显示图像
- 图像的基本操作
- 获取图像属性
- 图像裁剪和复制
- 图像处理
- 灰度化
- 高斯模糊
- 边缘检测
- 视频处理
- 读取和显示视频
- 视频录制
- OpenCV 高级功能
- 物体检测
- Haar 级联分类器
- 特征点检测
- SIFT 和 SURF
- 图像分割
- GrabCut
- 实战案例分析
- 人脸识别
- 物体跟踪
- 总结
- 参考资料
计算机视觉是人工智能的一个重要分支,旨在使计算机能够理解和解释图像和视频内容。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。本文将详细介绍 OpenCV 的基本概念、安装配置、核心功能以及实际应用,帮助读者快速上手计算机视觉开发。
OpenCV 是一个开源的计算机视觉库,支持多种编程语言(如 C++、Python、Java 等),并在多个平台上可用(如 Windows、Linux、macOS)。OpenCV 提供了大量的图像处理和计算机视觉算法,广泛应用于图像识别、物体检测、人脸识别等领域。
- 图像处理:如图像增强、滤波、边缘检测等。
- 物体检测:如行人检测、车辆检测等。
- 人脸识别:如人脸检测、人脸识别等。
- 视频分析:如运动检测、背景减除等。
OpenCV 可以通过 pip 工具轻松安装。
pip install opencv-python
安装完成后,可以通过以下代码验证 OpenCV 是否安装成功:
import cv2
print(cv2.__version__)
OpenCV 提供了读取和显示图像的基本功能。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 形状:获取图像的高度、宽度和通道数。
- 像素值:获取和设置特定像素的值。
# 获取图像的形状
height, width, channels = image.shape
print(f'Height: {height}, Width: {width}, Channels: {channels}')# 获取特定像素的值
pixel_value = image[100, 100]
print(f'Pixel Value at (100, 100): {pixel_value}')# 设置特定像素的值
image[100, 100] = [0, 255, 0] # 设置为绿色
- 裁剪:提取图像的一部分。
- 复制:创建图像的副本。
# 裁剪图像
cropped_image = image[50:150, 50:150]# 复制图像
copied_image = image.copy()
将彩色图像转换为灰度图像。
# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图像
cv2.imshow('Grey Image', grey_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
对图像进行高斯模糊处理。
# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)# 显示模糊图像
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用 Canny 算法检测图像的边缘。
# 边缘检测
edges = cv2.Canny(image, 100, 200)# 显示边缘图像
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 可以读取和显示视频文件。
import cv2# 读取视频
cap = cv2.VideoCapture('video.mp4')while cap.isOpened():ret, frame = cap.read()if not ret:break# 显示帧cv2.imshow('Frame', frame)# 按 q 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()
OpenCV 可以录制视频。
import cv2# 初始化视频捕获
cap = cv2.VideoCapture(0)# 定义编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))while cap.isOpened():ret, frame = cap.read()if not ret:break# 写入帧out.write(frame)# 显示帧cv2.imshow('Frame', frame)# 按 q 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
Haar 级联分类器是一种常用的物体检测方法,可以用于检测人脸、眼睛等。
import cv2# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像
image = cv2.imread('image.jpg')# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制矩形框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)# 显示图像
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
SIFT(Scale-Invariant Feature Transform)和 SURF(Speeded-Up Robust Features)是常用的特征点检测算法。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 初始化 SIFT 检测器
sift = cv2.xfeatures2d.SIFT_create()# 检测特征点
keypoints, descriptors = sift.detectAndCompute(image, None)# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)# 显示图像
cv2.imshow('SIFT Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
GrabCut 是一种基于图割的图像分割算法,用于从背景中分离前景。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 初始化掩码
mask = np.zeros(image.shape[:2], np.uint8)# 定义前景和背景的初始矩形
rect = (50, 50, 300, 300)# 初始化前景和背景模型
bgd_model = np.zeros((1, 65), np.float64)
fgd_model = np.zeros((1, 65), np.float64)# 运行 GrabCut 算法
cv2.grabCut(image, mask, rect, bgd_model, fgd_model, 5, cv2.GC_INIT_WITH_RECT)# 将掩码转换为二值图像
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')# 应用掩码
segmented_image = image * mask2[:, :, np.newaxis]# 显示分割后的图像
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
假设我们有一个包含人脸的照片,需要进行人脸识别。
import cv2# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像
image = cv2.imread('people.jpg')# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 绘制矩形框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)# 保存结果
cv2.imwrite('detected_faces.jpg', image)
假设我们有一个视频,需要跟踪视频中的移动物体。
import cv2# 初始化视频捕获
cap = cv2.VideoCapture('video.mp4')# 初始化背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2()while cap.isOpened():ret, frame = cap.read()if not ret:break# 应用背景减除器fgmask = fgbg.apply(frame)# 显示帧cv2.imshow('Frame', frame)cv2.imshow('FG Mask', fgmask)# 按 q 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()
通过本文,我们深入了解了 OpenCV 的基本概念、安装配置、核心功能以及实际应用。OpenCV 是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。希望本文能帮助读者更好地理解和应用 OpenCV,提升计算机视觉开发能力。
- OpenCV 官方文档
- 计算机视觉入门教程
- OpenCV 实战案例
相关文章:
计算机视觉基础:OpenCV库详解
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机视觉基础:OpenCV库详解 计算机视觉基础:OpenCV库详解 计算机视觉基础:OpenCV库详解 引…...
UI自动化测试工具(超详细总结)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 常用工具 1、QTP:商业化的功能测试工具,收费,可用于web自动化测试 2、Robot Framework:基于Python可扩展的关…...
AJAX 全面教程:从基础到高级
AJAX 全面教程:从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX(Asynchronous JavaScript and XML…...
ONLYOFFICE 8.2测评:功能增强与体验优化,打造高效办公新体验
引言 随着数字化办公需求的不断增长,在线办公软件市场竞争愈加激烈。在众多办公软件中,ONLYOFFICE 无疑是一个颇具特色的选择。它不仅支持文档、表格和演示文稿的在线编辑,还通过开放的接口与强大的协作功能,吸引了众多企业和个人…...
Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!
在地球46亿年的漫长历史长河中,生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌?如何理解关键演化节点的具体过程?10月23日,Science Robotics发表重磅综述,首次系统性提出"古生物启发…...
uni-app表格带分页,后端处理过每页显示多少条
uni-app表格带分页,后端处理过每页可以显示多少条,一句设置好了每页显示的数据量,不需要钱的在进行操作,在进行对数据的截取 <th-table :column"column" :listData"data" :checkSort"checkSort"…...
基于STM32设计的矿山环境监测系统(NBIOT)_262
文章目录 一、前言1.1 项目介绍【1】开发背景【2】研究的意义【3】最终实现需求【4】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】上位机开发思路1.3 项目开发背景【1】选题的意义【2】摘要【3】国内外相关研究现状【5】参考文献1.4 开发工具的选择【1】设备端开发【2】…...
【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现
文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…...
219页华为供应链管理:市场预测SOP计划、销售预测与存货管理精要
一、华为ISC供应链管理 华为的集成供应链(ISC)领先实践和SISC(Siyuan Integrated Supply Chain)架构体现了其在供应链管理领域的深度和广度,以下是7点关键介绍: 全面的供应链视野:华为ISC涵盖…...
mac 安装指定的node和npm版本
mac 安装指定的node和npm版本 0.添加映像: export N_NODE_MIRRORhttps://npmmirror.com/mirrors/node 1、使用 npm 全局安装 n npm install -g n 如果报了sudo chown -R 502:20 "/Users/xxx/.npm" sudo npm install -g n 2、根据需求安装指定版本的 node …...
为什么分布式光伏规模是6MW为界点?
安科瑞 Acrel-Tu1990 最近,能源局颁布了一项规定,明确指出6兆瓦(MW)及以上的分布式光伏电站必须实现自发自用,自行消纳电力。多个省份的能源局进一步规定,规模超过6兆瓦的电站需按照集中式管理进行操作。此…...
arm64架构的linux 配置vm_page_prot方式
在 ARM64 架构上,通过 vm_page_prot 属性可以修改 UIO 映射内存的访问权限及缓存策略,常见的有非缓存(Non-cached)、写合并(Write Combine)等。下面是 ARM64 常用的 vm_page_prot 设置及其对应的操作方式。…...
vue3 + naive ui card header 和 title 冲突 bug
背景描述 最近发现一个 naive ui 上的问题,之前好好的,某一次升级后就出现了一个 bug,Modal 使用 card 布局后,Header Solt 下面的内容不见了,变成了 title,因为这个 solt 里面是有操作 action 的…...
Ubuntu 22.04.5 LTS配置 bond
本次纯实验,不会讲解bond功能,配置bond mode 1 和 mode 4 如何配置 确定内核模块是否加载 实验使用root用户权限,非root用户使用sudo 调用root权限 rootubuntu22:~# lsmod | grep bonding rootubuntu22:~# modprobe bonding rootubuntu22:~# …...
100种算法【Python版】第58篇——滤波算法之卡尔曼滤波
本文目录 1 算法步骤2 算法示例2.1 示例描述2.2 python代码3 算法应用:二维运动目标跟踪问题滤波算法是用于从信号中提取有用信息、去除噪声或估计系统状态的技术。在时间序列分析、信号处理和控制系统中,滤波算法起着关键作用。 1 算法步骤 卡尔曼滤波(Kalman Filter)的…...
关于几种卷积
1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权,对于一个通道来说,每个像素点加权是一样的&am…...
51单片机教程(五)- LED灯闪烁
1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…...
VUE3中Element table表头动态展示合计信息(不是表尾合计)
一、背景 原型上需要对两个字段动态合计,输出摘要信息 原先想到是的Element的 :summary-method,发现不是动态,所以换监听来实现 二、vue代码 <el-table v-model"loading" :data"itemList"><el-table-column la…...
git重置的四种类型(Git Reset)
git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件(使用了…...
【Java集合面试1】说说Java中的HashMap原理?
Java中的HashMap是一种基于哈希表的Map接口实现,它存储的内容是键值对(key-value)映射。HashMap允许空键(null)和空值(null),并且它的键值对没有顺序。以下是HashMap的一些关键工作原…...
万字长文解读机器学习——决策树
🌺历史文章列表🌺 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…...
内网环境,基于k8s docer 自动发包
背景:生产环境是内网,无法连接外部git环境,需要上传tar包打成镜像,然后发布。 简单写了个脚本,记录下方便复用。 将tar包和脚本拷贝到同一个目录下。 使用方式: tar 包名称格式:服务名-版本号…...
【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)
一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…...
Qt 编写插件plugin,支持接口定义信号
https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级,在编写插件的基础上,支持接口类定义信号。 环境:Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…...
Qt中 QWidget 和 QMainWindow 区别
QWidget 用来构建简单窗口 QMainWindow 用来构建更复杂的窗口,QMainWindow 继承自QWidget,在QWidget 的基础上提供了菜单栏、工具栏、状态栏等功能 菜单栏(QMenuBar)工具栏(QToolBar)状态栏(Q…...
Kafka集群中数据的存储是按照什么方式存储的?
1)Topic 数据的存储机制 Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,为防止log文件…...
中断的硬件框架
往期内容 本专栏往期内容,interrtupr子系统: 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…...
数据备份策略:企业防御的关键
数据备份是保护数据免受网络攻击的重要步骤。在从恶意软件或勒索软件攻击中恢复时,公司可以使用保存的备份将其恢复到之前的状态。但是,为了确保数据的完全安全,任何公司的备份策略都应该在其总体策略中包含多种解决方案。 根据关于创建、消…...
Baget 私有化nuget
Baget下载 1、下载运行 方法一:cmd运行 dotnet BaGet.dll --urls http://*:8002 http://localhost:8002 方法二:bat脚本运行Baget 创建Start.bat dotnet BaGet.dll --urls http://*:8002 运行Start.bat 方法三:部署成Window服务 NSSM部…...
前端函数的参数都有哪些?
在前端开发中,函数的分类可以根据不同的标准进行。以下是一些常见的函数分类方式,并附有相应的例子: 按传递方式分类: 按值传递:JavaScript 中的基本类型(如数字、字符串、布尔值)都是按值传递的…...
高端模板网站建设公司/seo引擎搜索网站
模块的引入方式: 1.import 模块名:导入模块中的所有内容(引入多个用逗号分隔) import random,time 2.from 模块名 import 函数名1,函数名2... 导入部分模块 (导入部分的话直接使用) 3.from 模块…...
做微信h5的网站/百度联盟推广
同步队列:SynchronousQueue,零容量的SynchronousQueue,一进一出,避免队列里缓冲数据,这样在系统异常关闭时,就能排除因为阻塞队列丢消息的可能 SynchronousQueue没有容量,是无缓冲等待队列&…...
使用公网ip做网站地址/百度自媒体平台
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:高效的任务规划题目输入输出描述示例一输入输出说明示例二输入输…...
我公司是做网站开发的怎么纳税/seo收录排名
在上篇随笔中对于客户实例传递的xml实现中,手动定义了xml的数据格式,如果现在对产品实例进行传递,那么还要手动对产品实例进行xml进行数据格式化。现在有一套为数据传递定义的协议,那就是soap。其实html也是一种数据存储格式&…...
国内做外卖的网站有哪些/数据分析网官网
思路:要找一个最大距离最小的点,那么有2个方向1.这u点下面最远距离2.这个u点上面的最远距离,这里向上走有2种走法,一直是直接求u点的子节点没有访问过求向上和向下的最大值,访问过则求向上最大值和向下次大值的最大值&…...
网站后台管理模板html/沈阳专业seo
”能别带耳机吗?“”你能别来打扰我工作吗?“:“不能!”前阵子有篇热文:当一个程序员一天被打扰 10 次,后果很惊人!看后网友都表示深有同感,来看看这些网友都是怎么讲的:热心市民开发…...