计算机视觉基础: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的一些关键工作原…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
