开源计算机视觉库opencv-python详解
开源计算机视觉库opencv-python详解
- OpenCV-Python的核心功能:
- 安装OpenCV-Python:
- 使用OpenCV-Python的基本步骤:
- OpenCV-Python的高级应用:
- 注意事项:
- OpenCV-Python的高级应用示例:
- 1. 人脸识别
- 2. 目标跟踪
- 3. 特征匹配
- 注意事项:
- 深度学习集成示例:
- 1. 使用OpenCV和TensorFlow进行物体检测
- 2. 使用OpenCV进行实时人脸识别
- 结束语:
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV-Python是其Python接口,结合了OpenCV C++ API和Python语言的特点,使得在Python中实现高效、强大的计算机视觉任务变得简单。
OpenCV-Python的核心功能:
- 图像处理:包括图像滤波、几何变换、颜色空间转换、直方图处理等。
- 视频分析:涉及运动估计、背景减除、对象跟踪等。
- 2D和3D特征工具:用于特征检测、描述和匹配。
- 相机校准和3D重建:包括立体匹配和结构从运动中恢复。
- 机器学习:包括常用的机器学习算法,如SVM、决策树、Boosting等。
- 深度学习:与TensorFlow、Caffe等深度学习框架集成,用于图像识别、目标检测等。
- 高级视觉:例如SLAM(Simultaneous Localization and Mapping)、光流等。
安装OpenCV-Python:
在Python环境中,通常可以使用pip进行安装:
pip install opencv-python
如果需要包含OpenCV的contrib模块,可以使用:
pip install opencv-contrib-python
使用OpenCV-Python的基本步骤:
- 导入库:
import cv2
- 读取和显示图像:
image = cv2.imread('image.jpg')
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 处理图像:
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- 保存图像:
cv2.imwrite('gray_image.jpg', gray_image)
- 处理视频:
cap = cv2.VideoCapture('video.mp4')
while True:ret, frame = cap.read()if not ret:breakgray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video', gray_frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()
OpenCV-Python的高级应用:
- 人脸识别:使用Haar级联进行人脸检测。
- 目标跟踪:使用Meanshift或Camshift算法跟踪视频中的对象。
- 特征匹配:使用SIFT、SURF等算法进行特征提取和匹配。
- 图像分割:使用阈值、边缘检测、区域生长等方法进行图像分割。
- 机器学习:利用OpenCV中的机器学习模块进行图像分类、回归等任务。
注意事项:
- OpenCV-Python默认使用BGR格式读取和显示图像,而不是RGB格式。
- 在使用OpenCV处理图像时,颜色空间转换是一个常见的步骤。
- 对于不同的计算机视觉任务,可能需要安装额外的库或模块。
OpenCV-Python因其强大的功能和易用性,被广泛应用于学术研究和工业项目中。随着深度学习在计算机视觉领域的快速发展,OpenCV-Python也在不断集成新的深度学习模型和算法。
OpenCV-Python的高级应用示例:
1. 人脸识别
OpenCV提供了预训练的Haar级联分类器,可以用于检测图像中的人脸。以下是一个简单的示例:
import cv2
# 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图像
img = cv2.imread('group_photo.jpg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# 为每个检测到的人脸画矩形
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Detected Faces', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 目标跟踪
OpenCV中的Meanshift和Camshift算法可以用于跟踪视频中的移动对象。
import cv2
# 初始化视频捕获对象
cap = cv2.VideoCapture('tracking_video.mp4')
# 读取第一帧
ret, frame = cap.read()
# 设置初始跟踪窗口
x, y, w, h = 300, 200, 100, 50
track_window = (x, y, w, h)
# 设置ROI用于跟踪
roi = frame[y:y+h, x:x+w]
# 转换为HSV并创建掩模
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
# 计算直方图,用于反向投影
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 设置终止条件,迭代10次或移动至少1 pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while True:ret, frame = cap.read()if not ret:break# 转换为HSVhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# 应用Meanshift获取新位置ret, track_window = cv2.meanShift(dst, track_window, term_crit)# 在图像上绘制它x, y, w, h = track_windowimg2 = cv2.rectangle(frame, (x, y), (x+w, y+h), 255, 2)cv2.imshow('Meanshift Tracking', img2)k = cv2.waitKey(60) & 0xffif k == 27:break
cv2.destroyAllWindows()
cap.release()
3. 特征匹配
使用SIFT、SURF等算法进行特征提取和匹配,可以用于图像拼接、3D重建等。
import cv2
import numpy as np
# 读取两幅图像
img1 = cv2.imread('box.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE)
# 初始化SIFT检测器
sift = cv2.SIFT_create()
# 计算关键点和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 使用BFMatcher进行匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# 应用比率测试
good = []
for m, n in matches:if m.distance < 0.75 * n.distance:good.append(m)
# 绘制匹配结果
img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, flags=2)
cv2.imshow('Feature Matches', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意事项:
- OpenCV-Python的函数通常接受NumPy数组作为输入和输出,因此熟悉NumPy库对于有效地使用OpenCV非常重要。
- 在使用
深度学习模型和算法时,OpenCV-Python可能需要额外的依赖项,如TensorFlow、PyTorch或ONNX Runtime等。
深度学习集成示例:
1. 使用OpenCV和TensorFlow进行物体检测
import cv2
import tensorflow as tf
# 加载TensorFlow的物体检测模型(假设已经有一个冻结的GraphDef模型)
model_path = 'frozen_inference_graph.pb'
labels_path = 'mscoco_label_map.pbtxt'
num_classes = 90
# 加载模型和标签
detection_graph = tf.Graph()
with detection_graph.as_default():od_graph_def = tf.GraphDef()with tf.gfile.GFile(model_path, 'rb') as fid:serialized_graph = fid.read()od_graph_def.ParseFromString(serialized_graph)tf.import_graph_def(od_graph_def, name='')
# 加载标签
label_map = label_map_util.load_labelmap(labels_path)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=num_classes, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
# 读取图像
image_np = np.array(cv2.imread('object_detection.jpg'))
# 执行物体检测
with detection_graph.as_default():with tf.Session(graph=detection_graph) as sess:# 扩展图像维度image_np_expanded = np.expand_dims(image_np, axis=0)image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')boxes = detection_graph.get_tensor_by_name('detection_boxes:0')scores = detection_graph.get_tensor_by_name('detection_scores:0')classes = detection_graph.get_tensor_by_name('detection_classes:0')num_detections = detection_graph.get_tensor_by_name('num_detections:0')# 运行模型(boxes, scores, classes, num_detections) = sess.run([boxes, scores, classes, num_detections],feed_dict={image_tensor: image_np_expanded})# 可视化结果v = visualize_boxes_and_labels_on_image_array(image_np,np.squeeze(boxes),np.squeeze(classes).astype(np.int32),np.squeeze(scores),category_index,use_normalized_coordinates=True,line_thickness=8)# 显示图像cv2.imshow('Object Detection', image_np)cv2.waitKey(0)cv2.destroyAllWindows()
2. 使用OpenCV进行实时人脸识别
import cv2
# 加载人脸识别模型(假设已经训练好了)
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.read('face_model.yml')
# 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 启动视频捕获
cap = cv2.VideoCapture(0)
while True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.1, 4)for (x, y, w, h) in faces:face_roi = gray[y:y+h, x:x+w]# 进行预测label, confidence = face_recognizer.predict(face_roi)cv2.putText(frame, str(label), (x, y-5), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2)cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.imshow('Face Recognition', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()
结束语:
OpenCV-Python是一个非常强大的工具,它为计算机视觉任务提供了一个丰富的函数库。通过结合深度学习和其他机器学习技术,OpenCV-Python可以用于解决复杂的问题,如图像识别、物体检测、人脸识别等。随着技术的发展,OpenCV-Python也在不断更新和改进,以支持更多的功能和算法。如果您对特定功能或应用有更多的问题,欢迎继续提问。
相关文章:
开源计算机视觉库opencv-python详解
开源计算机视觉库opencv-python详解 OpenCV-Python的核心功能:安装OpenCV-Python:使用OpenCV-Python的基本步骤:OpenCV-Python的高级应用:注意事项:OpenCV-Python的高级应用示例:1. 人脸识别2. 目标跟踪3. …...

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系
创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1:点击标签页选中菜单进行高亮展示问题2:点击标签页路由也要跳转 四、解决bug 先展示最终效果 …...
基于51单片机的智能火灾报警系统
基于51单片机的智能火灾报警系统 摘要: 本文提出了一种基于51单片机的智能火灾报警系统。该系统采用烟雾传感器和温度传感器来检测火灾的发生,并通过单片机进行数据处理和报警控制。此外,该系统还具有无线通信功能,可以实时将火灾…...

【数据结构】堆的TopK问题
大家好,我是苏貝,本篇博客带大家了解堆的TopK问题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 前言二. TopK三. 代码 一. 前言 TOP-K问题:即求数据结合中前K个最大的元…...
Vue后台管理系统笔记-01
npm(Node Package Manager)和 yarn 是两个常用的包管理工具,用于在 Node.js 项目中安装、管理和更新依赖项。它们有以下几个区别: 性能和速度:在包的安装和下载方面,yarn 通常比 npm 更快速。yarn 使用了并…...

飞天使-学以致用-devops知识点3-安装jenkins
文章目录 构建带maven环境的jenkins 镜像安装jenkinsjenkins yaml 文件安装插件jenkins 配置k8s创建用户凭证 构建带maven环境的jenkins 镜像 # 构建带 maven 环境的 jenkins 镜像 docker build -t 192.168.113.122:8858/library/jenkins-maven:jdk-11 .# 登录 harbor docker …...

08、MongoDB -- MongoDB 的 集合关联($lookup 和 DBRef 实现集合关联)
目录 MongoDB 的 集合关联演示前提:登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 SQL 术语 与 Mongodb 的对应关系使用 $lookup 实现集合关联语法格式添加测试数据1、查询出订单数量大于6&a…...

前方高能,又一波Smartbi签约喜报来袭
近期,交通银行、厦门国际银行、中原农业保险、江苏中天科技等多家知名企业签约Smartbi,携手Smartbi实现数据驱动业务新增长。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务,为各行各业提供提供一站式商业智能平台(PaaS&a…...

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂
最大通过数 思路:假设左边能通过 x 关,右边能通过 y 关,x∈[0,n],通过二分,在前缀和中枚举右边通过的关卡数,保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…...
【JavaSE】泛型
系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 学习泛型之前请大家先详细地了解一下,关于Java…...

APS(高级计划与调度系统)难度超高,ERP在它面前就是弟弟。
一、APS定义和功能模块 APS系统是Advanced Planning and Scheduling System(高级计划与调度系统)的缩写。它是一种计划和调度管理软件系统,旨在帮助企业优化生产计划和资源调度,提高生产效率和响应能力。 APS系统利用先进的算法和…...

ArmV8架构
Armv8/armv9架构入门指南 — Armv8/armv9架构入门指南 v1.0 documentation 上面只是给了一个比较好的参考文档 其他内容待补充...
[论文笔记] Open-sora 2、视频数据集介绍 MSR-VTT
MSR-VTT COVE - Computer Vision Exchange 论文参考:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/cvpr16.msr-vtt.tmei_-1.pdf 用于视频理解的大规模视频基准,特别是将视频翻译为文本的新兴任务。这是通过从商业视频搜索引擎收集 257 个热门查询…...

【Windows 常用工具系列 14 -- windows 网络驱动映射】
文章目录 windows 网络驱动映射 windows 网络驱动映射 映射网络驱动器的意思是将局域网中的某个目录映射成本地驱动器号。 在windows上将服务器目录映射到本地盘: 进入到服务器执行下面命令既可以看到对应的 IP地址: 将对应的IP地址填入上图中。 映…...

Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件
场景 Pythont通过request以及BeautifulSoup爬取几千条情话: Pythont通过request以及BeautifulSoup爬取几千条情话_爬取情话-CSDN博客 Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本: Node-RED中使用html节点爬取HTML网页资料之爬…...

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布
一、3D 音频 3D 音频分论坛将于3月27日同期举办! 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验,跨越时空的限制,探索未知的世界。同时,提供更加丰富、立体的情感表达和交流方式,让人类能够更加深入地理解彼此&…...

Java基础 - 6 - 面向对象(二)
Java基础 - 6 - 面向对象(一)-CSDN博客 二. 面向对象高级 2.1 static static叫做静态,可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰,分为两种:类变量、实例变量(对象…...

SpringCloud-MQ消息队列
一、消息队列介绍 MQ (MessageQueue) ,中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。消息队列是一种基于生产者-消费者模型的通信方式,通过在消息队列中存放和传递消息,实现了不同组件、服务或系统…...

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
509. 斐波那契数 刷题https://leetcode.cn/problems/fibonacci-number/description/文章讲解https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解https://www.bilibili.com/video/BV…...
[python] 代码工具箱
在 Python 3 的开发过程中,有一些小而实用的工具包可以帮助减轻开发负担,提升工作效率。这些工具包通常专注于解决特定问题或提供特定功能,使代码更简洁和可维护。以下是一些常用的工具包,可以简化开发过程: backoff&a…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...