OpenCV快速入门

OpenCV(Open Source Computer Vision Library,开源计算机视觉库)是一个广泛应用于图像处理、计算机视觉、视频分析等领域的开源库。它不仅适用于研究人员和开发人员,还被广泛用于学术、工业和商业应用。本篇文章将帮助你快速了解 OpenCV 的起源、功能、应用场景以及如何在 Python 中使用它。

1. OpenCV 的诞生与发展历程

1.1 OpenCV 的诞生

OpenCV 最早由 Intel 于 1999 年推出,旨在为开发者提供一个高效、易用的计算机视觉库,特别是在处理图像和视频方面。Intel 推出的 OpenCV 成为了计算机视觉领域的标杆,广泛应用于学术研究和工业项目中。

1.2 OpenCV 的发展历程

  • 1999年:OpenCV 发布,提供了基本的图像处理和边缘检测功能。
  • 2006年:版本更新,优化性能,支持多核处理和并行计算。
  • 2012年:引入深度学习支持,增加了 DNN 模块,可以加载训练好的深度学习模型。
  • 现在:OpenCV 支持 Python、C++、Java、Android 等平台,成为计算机视觉和机器学习的核心库之一。

2. OpenCV 的实际应用场景

OpenCV 在多个实际场景中有广泛应用,以下是一些典型的例子:

  1. 人脸检测与识别:在安防监控、社交应用中,OpenCV 被广泛应用于人脸识别、面部表情识别等任务。
  2. 自动驾驶:OpenCV 在自动驾驶汽车中扮演了重要角色,帮助汽车识别道路标志、行人、车辆等信息。
  3. 医学图像分析:通过 OpenCV,可以对医学图像进行处理,如分割肿瘤区域、识别病变等。
  4. 工业检测:OpenCV 可以帮助工业生产线上的质量检测、缺陷检测、物体跟踪等任务。
  5. 增强现实:通过对图像中的物体进行检测,OpenCV 可以将虚拟物体与现实世界图像融合,实现增强现实效果。

3. OpenCV 能做什么?不能做什么?

3.1 OpenCV 能做的事情

  • 图像处理:如图像平滑、边缘检测、形态学处理、图像锐化等。
  • 特征检测与匹配:如角点检测、SURF、SIFT 等特征点提取与匹配。
  • 人脸识别与检测:使用训练好的分类器进行人脸检测和识别。
  • 物体检测与跟踪:通过训练模型进行物体检测,支持不同算法,如 HOG + SVM、深度学习方法等。
  • 视频分析:视频分割、背景建模、光流计算、运动物体跟踪等。
  • 图像分类与深度学习:通过 DNN 模块支持深度学习模型的推理,进行图像分类、目标检测等任务。

3.2 OpenCV 做不到的事情

  • 复杂的神经网络训练:OpenCV 本身并不是深度学习框架,虽然支持加载深度学习模型进行推理,但不提供高效的神经网络训练功能。
  • 大规模的数据处理:OpenCV 适合处理图像和视频,但对于大规模、复杂的实时数据处理,它并非最佳选择。

4. OpenCV 的主要功能

接下来,我们将详细介绍 OpenCV 中的几个常用功能,并附带代码示例。

4.1 图像读取与显示

import cv2# 读取图像
image = cv2.imread('image.jpg')# 显示图像
cv2.imshow('Image', image)# 等待用户按键
cv2.waitKey(0)# 关闭显示窗口
cv2.destroyAllWindows()

代码注释

  • cv2.imread():读取图像。
  • cv2.imshow():显示图像。
  • cv2.waitKey():等待键盘输入。
  • cv2.destroyAllWindows():关闭所有显示的窗口。

4.2 图像转换为灰度图

# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码注释

  • cv2.cvtColor():转换图像颜色空间,将彩色图像转换为灰度图。

4.3 边缘检测(Canny 算法)

# Canny 边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 显示边缘图
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码注释

  • cv2.Canny():执行 Canny 边缘检测。

4.4 人脸检测

# 加载预训练的 Haar 人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 人脸检测
faces = face_cascade.detectMultiScale(gray_image, 1.3, 5)# 在图像中绘制矩形框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)cv2.imshow('Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码注释

  • cv2.CascadeClassifier():加载训练好的 Haar 分类器。
  • detectMultiScale():检测图像中的多尺度物体(本例为人脸)。
  • cv2.rectangle():绘制矩形框标记检测到的人脸。

4.5 物体追踪

# 初始化视频捕捉
cap = cv2.VideoCapture('video.mp4')# 初始化追踪器
tracker = cv2.TrackerKCF_create()# 读取第一帧图像
ret, frame = cap.read()# 选择追踪区域
bbox = cv2.selectROI('Tracking', frame, fromCenter=False, showCrosshair=True)
tracker.init(frame, bbox)# 持续追踪
while True:ret, frame = cap.read()if not ret:breakret, bbox = tracker.update(frame)if ret:x, y, w, h = [int(v) for v in bbox]cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.imshow('Tracking', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

代码注释

  • cv2.selectROI():选择追踪区域。
  • cv2.TrackerKCF_create():创建 KCF 跟踪器。
  • tracker.update():更新追踪器的位置。

5. 进阶应用:人脸换脸与背景替换

5.1 换脸(人脸交换)

# 读取两张图片
image1 = cv2.imread('person1.jpg')
image2 = cv2.imread('person2.jpg')# 转为灰度图
gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# 进行人脸检测
faces1 = face_cascade.detectMultiScale(gray_image1, 1.1, 4)
faces2 = face_cascade.detectMultiScale(gray_image2, 1.1, 4)# 假设每张图片只有一个人脸
(x1, y1, w1, h1) = faces1[0]
(x2, y2, w2, h2) = faces2[0]# 提取人脸区域
face1 = image1[y1:y1+h1, x1:x1+w1]
face2 = image2[y2:y2+h2, x2:x2+w2]# 将face1替换到face2的位置
image2[y2:y2+h1, x2:x2+w1] = face1cv2.imshow('Face Swapped', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2 背景替换

# 读取原始图像和背景图像
image = cv2.imread('person.jpg')
background = cv2.imread('new_background.jpg')# 转为灰度图并检测边缘
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)# 创建掩码
mask = cv2.bitwise_not(thresh)# 提取人物部分
person = cv2.bitwise_and(image, image, mask=thresh)# 提取背景部分
bg = cv2.bitwise_and(background, background, mask=mask)# 将背景和人物合成
result = cv2.add(person, bg)cv2.imshow('Scene Generated', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 总结

通过本篇文章,你已经掌握了 OpenCV 的基础知识和常见功能,并且学习了如何使用它进行图像处理、人脸检测、物体追踪、换脸和背景替换等实际应用。你还了解了 OpenCV 在各个行业中的广泛应用,特别是在计算机视觉、自动驾驶、工业检测等领域的实际价值。

希望这篇文章能帮助你更好地理解 OpenCV,并激发你在计算机视觉领域进一步探索的兴趣!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9022.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区,只是默认开窗存储; 分区是按行,如一百行数据,按十位上的数字分区,则有十个分区,每个分区里有十行; 分桶是根据某个字段哈希对桶数取…

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…

Mit6.S081-实验环境搭建

Mit6.S081-实验环境搭建 注:大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu(quick emulator):这是一个模拟硬件环境的软件,利用它可以运行我们编译好的操作系统。 准备一个Linux系统&#xf…

AWS账号安全:如何防范与应对账号被盗风险

在云计算时代,Amazon Web Services(AWS)作为全球领先的云服务提供商,为企业和个人提供了强大的计算资源和灵活的服务。然而,随着云计算的普及,AWS账号被盗的风险也随之增加。我们九河云有多年用云经验&…

IPTABLE:Linux下的网络防火墙

IPTABLE:Linux下的网络防火墙 引言 在Linux系统中,IPtable是一种强大的网络防火墙工具,广泛应用于各种网络环境中。它不仅可以实现基本的包过滤功能,还能进行网络地址转换(NAT)、数据包记录、流量统计等高…

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

友思特应用 | 动态捕捉:高光谱相机用于移动产线上的食品检测

导读 高光谱成像技术能够为食品安全助力。以友思特BlackIndustry SWIR 1.7 Max 为代表的高光谱相机,完美解决了移动产线检测的应用难点。 高光谱技术:为食品安全保驾护航 食品安全一直是大众关心的热点话题,提供安全、高质量的食品需要对食…

Java——》try-with-resource

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【极客兔兔-Web框架Gee详解】Day0 序言

文章目录 一、Web 开发1. 什么是Web 开发?2. 主要组成部分2.1 前端开发2.2 后端开发2.3 全栈开发2.4 数据库管理 3. Web开发过程3.1 规划和设计:3.2 开发和编码:3.3 测试和优化:3.4 部署和维护: 4. 总结 二、用标准库n…

点击文本将内容填入tinymce-vue 富文本编辑器的光标处

富文本编辑器组件 <template><div ref"tinymceBox" class"tinymce-box"><Editor id"myEditor" v-model"contentValue" :init"init" :disabled"disabled" blur"inputBlur" click"o…

3.2cpu

这个转换原理是基于&#xff0c;地址号*大小页内偏移量&#xff0c;通过页表使逻辑号和内存号之间建立起联系&#xff0c;从而实现地址的转换 按字节寻址&#xff0c;意思是说一个地址的大小是一个字节 页表记录的是逻辑块号与实际存储的主存块号之间的映射关系&#xff0c;是…

SQLI LABS | Less-35 GET-Bypass Add Slashes (we dont need them) Integer Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-35/ 话不多说…

小北的字节跳动青训营与LangChain实战课:深入探索输出解析器与Pydantic解析器重构(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

Leetcode 两数之和 Ⅱ - 输入有序数组

这段代码实现了在一个非递减排序的数组中找到两个数&#xff0c;使它们的和等于目标值的算法。算法使用了双指针技术&#xff0c;具体思想如下&#xff1a; 算法思想&#xff1a; 初始化指针&#xff1a;定义两个指针 left 和 right&#xff0c;分别指向数组的起始位置和末尾位…

UE5.4 PCG 复制关卡实例

关卡实例&#xff1a;最大层级的管理&#xff0c;方便关卡级别的复制、重载 1.创建关卡实例&#xff0c;右箭生成PCG设置。注意&#xff1a;当关卡实例发生变化&#xff0c;需要重新手动再创建一次PCG设置 2.直接拖放到PCG图&#xff0c;设置如下 说明&#xff1a;PCG设置文…

C++ | Leetcode C++题解之第551题学生出勤记录I

题目&#xff1a; 题解&#xff1a; class Solution { public:bool checkRecord(string s) {int absents 0, lates 0;for (auto &ch : s) {if (ch A) {absents;if (absents > 2) {return false;}}if (ch L) {lates;if (lates > 3) {return false;}} else {lates…

Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)

目录 安装所需库 Python获取PDF页数 Python获取PDF页面尺寸 Python获取PDF页面旋转角度 Python获取PDF页面方向 Python获取PDF页面标签 Python获取PDF页面边框信息 了解PDF页面信息对于有效处理、编辑和管理PDF文件至关重要。PDF文件通常包含多个页面&#xff0c;每个页…

设计模式(主要的五种)

1.设计模式&#xff1a; 设计模式就是代码设计经验 2.设计模式的类型&#xff1a; 分为三大类&#xff1a;创建型模式&#xff0c;结构型模式&#xff0c;行为模式 创建型模式&#xff1a; 单例模式&#xff1a;某个类只能有一个实例&#xff0c;提供一个全局的访问点。 工…

【北京迅为】itop-3588开发板摄像头使用手册Android12 双摄方案

本章节对应资料在网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \07_Android 系统开发配套资料\08_Android12 摄像头使用配套资料”目录下下载。 2.1 Android12 前摄后摄 网盘中默认的 Android12 源码支持四个摄像头单独打开&#xff0c;本小节我们来修改源码…

Javascript如何实现继承?

#一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称为“A的子类”&#xff0c;而把A称为“B的父类别”也可以称“A是B的超类” 继承的优点 继承可以使得子类具有父类别的…