当前位置: 首页 > news >正文

Python OpenCV精讲系列 - 计算机视觉应用深入理解(十五)

在这里插入图片描述

💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖
本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识别等多个领域。适合希望在计算机视觉方向上建立坚实基础的技术人员及研究者。每一课不仅包含理论讲解,更有实战代码示例,助力读者快速将所学应用于实际项目中,提升解决复杂视觉问题的能力。无论是入门者还是寻求技能进阶的开发者,都将在此收获满满的知识与实践经验。

引言

OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,被广泛应用于图像处理和计算机视觉的各种任务中。OpenCV不仅提供了丰富的API来处理图像和视频流,还支持多种高级计算机视觉技术,如目标检测、人脸识别、三维重建等。本文将详细介绍OpenCV在计算机视觉中的应用,并探讨其在不同领域的具体实现。

计算机视觉基础

计算机视觉是一门研究如何使计算机“看”的科学。它主要涉及图像处理、模式识别和机器学习等多个学科。OpenCV作为一款强大的工具库,支持广泛的计算机视觉应用,包括但不限于:

  • 图像处理:如图像增强、滤波、边缘检测等。
  • 目标检测:如物体识别、人脸检测等。
  • 三维重建:从多幅图像中恢复三维场景。
  • 视频分析:如运动检测、目标跟踪等。

图像处理

图像处理是计算机视觉中最基础的部分,它涉及对图像进行预处理和特征提取,为后续的高级应用奠定基础。

图像滤波

滤波是图像处理中的一个重要步骤,它可以去除图像中的噪声、平滑图像或突出某些特征。

import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg')# 应用高斯模糊
blurred = cv2.GaussianBlur(image, (5, 5), 0)# 显示结果
cv2.imshow('Blurred Image', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测

边缘检测用于提取图像中的边缘信息,是图像分割和特征提取的重要步骤。

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

在这里插入图片描述

目标检测

目标检测是指从图像中识别出特定的物体,并定位其位置。OpenCV支持多种目标检测方法。

Haar特征级联分类器

Haar特征级联分类器是一种快速的目标检测方法,常用于人脸检测。

# 加载级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, 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(image, (x, y), (x+w, y+h), (0, 255, 0), 2)# 显示结果
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

深度学习方法

OpenCV可以集成预训练的深度学习模型来执行更复杂的任务,如物体识别。

# 加载模型
model_path = 'path/to/model.pb'
config_path = 'path/to/config.pbtxt'net = cv2.dnn.readNetFromTensorflow(model_path, config_path)# 加载图像
image = cv2.imread('image.jpg')
blob = cv2.dnn.blobFromImage(image, size=(300, 300), swapRB=True, crop=False)# 进行预测
net.setInput(blob)
detections = net.forward()# 处理输出
for detection in detections[0, 0]:confidence = detection[2]if confidence > 0.5:# 获取边界框坐标box = detection[3:7] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]])(startX, startY, endX, endY) = box.astype("int")# 在图像上绘制边界框cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)# 显示结果
cv2.imshow('Object Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

三维重建

三维重建是指从多幅图像中恢复出三维场景的过程。OpenCV提供了工具来完成这一任务。

特征检测与匹配

特征检测与匹配是三维重建的关键步骤之一。

# 特征检测与匹配
orb = cv2.ORB_create()# 找到关键点和描述子
kp1, des1 = orb.detectAndCompute(image1, None)
kp2, des2 = orb.detectAndCompute(image2, None)# 匹配特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)# 排序匹配项
matches = sorted(matches, key=lambda x:x.distance)# 绘制匹配
img_matches = cv2.drawMatches(image1, kp1, image2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Feature Matches', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()

三角测量

三角测量是从两幅或多幅图像中恢复三维点云的过程。

# 三角测量
points4D = cv2.triangulatePoints(mtx @ np.hstack((np.eye(3), np.zeros((3,1)))), mtx @ np.hstack((R, t)), kp1.T, kp2.T)
points3D = cv2.convertPointsFromHomogeneous(points4D.T)# 将点云保存为PLY文件
ply_header = '''ply
format ascii 1.0
element vertex {}
property float x
property float y
property float z
end_header
'''def write_ply(fn, verts):verts = verts.reshape(-1, 3)with open(fn, 'w') as f:f.write(ply_header.format(len(verts)))np.savetxt(f, verts, '%f %f %f')write_ply('output.ply', points3D)

在这里插入图片描述

视频分析

视频分析涉及从视频流中提取有用的信息,如运动检测、目标跟踪等。

运动检测

运动检测用于识别视频帧之间的变化区域。

# 帧差法
prev_frame = Nonewhile cap.isOpened():ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (21, 21), 0)if prev_frame is None:prev_frame = graycontinue# 计算帧差frame_delta = cv2.absdiff(prev_frame, gray)thresh = cv2.threshold(frame_delta, 25, 255, cv2.THRESH_BINARY)[1]# 膨胀阈值图像填充孔洞thresh = cv2.dilate(thresh, None, iterations=2)# 显示结果cv2.imshow('frame', thresh)k = cv2.waitKey(30) & 0xffif k == 27:breakprev_frame = graycap.release()
cv2.destroyAllWindows()

目标跟踪

目标跟踪是指在视频序列中连续追踪一个或多个物体。

# 卡尔曼滤波器
kalman = cv2.KalmanFilter(4, 2)
kalman.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kalman.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kalman.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) * 0.03# 初始化状态向量
state = np.array([0, 0, 0, 0], np.float32)while cap.isOpened():ret, frame = cap.read()if not ret:break# 检测物体位置# 假设已经得到物体的位置position = np.array([x, y], np.float32)# 预测下一时刻的状态prediction = kalman.predict()# 更新卡尔曼滤波器kalman.correct(position)# 显示结果cv2.circle(frame, (int(prediction[0]), int(prediction[1])), 5, (0, 0, 255), -1)cv2.imshow('frame', frame)k = cv2.waitKey(30) & 0xffif k == 27:breakcap.release()
cv2.destroyAllWindows()

结论

OpenCV作为一款功能强大的计算机视觉库,为开发者提供了丰富的工具和算法来应对各种计算机视觉任务。通过上述介绍的方法和技术,我们可以有效地处理图像和视频数据,从简单的图像处理到复杂的三维重建和视频分析。随着技术的不断进步,OpenCV将继续为计算机视觉领域带来更多的可能性。

相关文章:

  • 宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?
  • C# winform s7.net 类读取 报错:数组不是一维数组。
  • 基于STM32和FPGA的射频数据采集系统设计流程
  • 8610 顺序查找
  • HTML基础用法介绍一
  • 基于Hive和Hadoop的电信流量分析系统
  • jmeter本身常用性能优化方法
  • python接口自动化——封装与调用
  • linux打开桌面软件(wps)、获取已打开的文件名(wps)
  • rk3588s android12 自启动 C程序
  • 爱速搭百度低代码开发平台
  • 当前时机适合进入AIGC行业吗?——行业发展阶段与市场需求的分析
  • SPI总结
  • SSM私人诊所管理系统—计算机毕业设计源码36406
  • 搜索引擎简介
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Apache Spark Streaming 使用实例
  • AWS实战 - 利用IAM对S3做访问控制
  • Laravel 菜鸟晋级之路
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Promise面试题2实现异步串行执行
  • Redis在Web项目中的应用与实践
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 那些年我们用过的显示性能指标
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 小程序 setData 学问多
  • 移动端唤起键盘时取消position:fixed定位
  • 异常机制详解
  • 自制字幕遮挡器
  • 1.Ext JS 建立web开发工程
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​ssh免密码登录设置及问题总结
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (计算机网络)物理层
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法设计与分析)第一章算法概述-习题
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • *1 计算机基础和操作系统基础及几大协议
  • .bat文件调用java类的main方法
  • .Net MVC4 上传大文件,并保存表单
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net组件程序设计之线程、并发管理(一)
  • ::before和::after 常见的用法
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?