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

开源计算机视觉库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的核心功能:

  1. 图像处理:包括图像滤波、几何变换、颜色空间转换、直方图处理等。
  2. 视频分析:涉及运动估计、背景减除、对象跟踪等。
  3. 2D和3D特征工具:用于特征检测、描述和匹配。
  4. 相机校准和3D重建:包括立体匹配和结构从运动中恢复。
  5. 机器学习:包括常用的机器学习算法,如SVM、决策树、Boosting等。
  6. 深度学习:与TensorFlow、Caffe等深度学习框架集成,用于图像识别、目标检测等。
  7. 高级视觉:例如SLAM(Simultaneous Localization and Mapping)、光流等。

安装OpenCV-Python:

在Python环境中,通常可以使用pip进行安装:

pip install opencv-python

如果需要包含OpenCV的contrib模块,可以使用:

pip install opencv-contrib-python

使用OpenCV-Python的基本步骤:

  1. 导入库
import cv2
  1. 读取和显示图像
image = cv2.imread('image.jpg')
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  1. 处理图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  1. 保存图像
cv2.imwrite('gray_image.jpg', gray_image)
  1. 处理视频
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的核心功能&#xff1a;安装OpenCV-Python&#xff1a;使用OpenCV-Python的基本步骤&#xff1a;OpenCV-Python的高级应用&#xff1a;注意事项&#xff1a;OpenCV-Python的高级应用示例&#xff1a;1. 人脸识别2. 目标跟踪3. …...

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …...

基于51单片机的智能火灾报警系统

基于51单片机的智能火灾报警系统 摘要&#xff1a; 本文提出了一种基于51单片机的智能火灾报警系统。该系统采用烟雾传感器和温度传感器来检测火灾的发生&#xff0c;并通过单片机进行数据处理和报警控制。此外&#xff0c;该系统还具有无线通信功能&#xff0c;可以实时将火灾…...

【数据结构】堆的TopK问题

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解堆的TopK问题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. TopK三. 代码 一. 前言 TOP-K问题&#xff1a;即求数据结合中前K个最大的元…...

Vue后台管理系统笔记-01

npm&#xff08;Node Package Manager&#xff09;和 yarn 是两个常用的包管理工具&#xff0c;用于在 Node.js 项目中安装、管理和更新依赖项。它们有以下几个区别&#xff1a; 性能和速度&#xff1a;在包的安装和下载方面&#xff0c;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 的 集合关联演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 SQL 术语 与 Mongodb 的对应关系使用 $lookup 实现集合关联语法格式添加测试数据1、查询出订单数量大于6&a…...

前方高能,又一波Smartbi签约喜报来袭

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

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂

最大通过数 思路&#xff1a;假设左边能通过 x 关&#xff0c;右边能通过 y 关&#xff0c;x∈[0,n]&#xff0c;通过二分&#xff0c;在前缀和中枚举右边通过的关卡数&#xff0c;保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…...

【JavaSE】泛型

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 学习泛型之前请大家先详细地了解一下&#xff0c;关于Java…...

APS(高级计划与调度系统)难度超高,ERP在它面前就是弟弟。

一、APS定义和功能模块 APS系统是Advanced Planning and Scheduling System&#xff08;高级计划与调度系统&#xff09;的缩写。它是一种计划和调度管理软件系统&#xff0c;旨在帮助企业优化生产计划和资源调度&#xff0c;提高生产效率和响应能力。 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上将服务器目录映射到本地盘&#xff1a; 进入到服务器执行下面命令既可以看到对应的 IP地址&#xff1a; 将对应的IP地址填入上图中。 映…...

Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件

场景 Pythont通过request以及BeautifulSoup爬取几千条情话&#xff1a; Pythont通过request以及BeautifulSoup爬取几千条情话_爬取情话-CSDN博客 Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本&#xff1a; Node-RED中使用html节点爬取HTML网页资料之爬…...

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&…...

Java基础 - 6 - 面向对象(二)

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

SpringCloud-MQ消息队列

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

代码随想录算法训练营第三十八天|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 的开发过程中&#xff0c;有一些小而实用的工具包可以帮助减轻开发负担&#xff0c;提升工作效率。这些工具包通常专注于解决特定问题或提供特定功能&#xff0c;使代码更简洁和可维护。以下是一些常用的工具包&#xff0c;可以简化开发过程&#xff1a; backoff&a…...

Linux——网络基础

计算机网络背景 网络发展 独立模式: 计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计算机再进行相应…...

Vue:双token无感刷新

文章目录 初次授权与发放Token&#xff1a;Access Token的作用&#xff1a;Refresh Token的作用&#xff1a;无感刷新&#xff1a;安全机制&#xff1a;后端创建nest项目AppController 添加login、refresh、getinfo接口创建user.dto.tsAppController添加模拟数据 前端Hbuilder创…...

实现一个作用域插槽的场景

vue项目中&#xff0c;插槽slot有三种分别是&#xff1a;默认插槽、具名插槽、作用域插槽。默认插槽和具名插槽在平时的开发中用的比较多&#xff0c;作用域插槽用的相对较少&#xff0c;以前我对作用域插槽不是很理解&#xff0c;现在理解了一下。下面通过代码来实现一个作用域…...

Qt QPainter的使用方法

重点&#xff1a; 1.QPainter在QWidget窗口的paintEvent中使用。 2.QPainter通常涉及到设置画笔、设置画刷、绘图&#xff08;QPen、QBrush、drawxx&#xff09;三个流程。 class Widget : public QWidget {Q_OBJECTprotected:void paintEvent(QPaintEvent *event) Q_DEC…...

低代码:数智化助力新农业发展

随着科技的飞速发展和数字化转型的深入推进&#xff0c;低代码开发平台正逐渐成为软件开发的热门话题。尤其在农业领域&#xff0c;低代码技术为传统农业注入了新的活力&#xff0c;助力新农业实现高效、智能的发展。 低代码开发平台的概念与特点 随着科技的飞速发展&#xff0…...

3d模型怎么镜像?3d模型镜像的步骤---模大狮模型网

在3D建模软件中&#xff0c;对3D模型进行镜像操作通常是指沿着某个轴线(如X、Y、Z轴)进行镜像翻转&#xff0c;使模型在该轴线的一侧产生对称的镜像效果。以下是在常见的3D建模软件中对3D模型进行镜像的一般步骤&#xff1a; 3d模型镜像步骤&#xff1a; 选择模型&#xff1a;…...

笔记本hp6930p安装Android-x86补记

在上一篇日记中&#xff08;笔记本hp6930p安装Android-x86避坑日记-CSDN博客&#xff09;提到hp6930p安装Android-x86-9.0&#xff0c;无法正常启动&#xff0c;本文对此再做尝试&#xff0c;原因是&#xff1a;Android-x86-9.0不支持无线网卡&#xff0c;需要在BIOS中关闭WLAN…...

为什么MySQL中多表联查效率低,连接查询实现的原理是什么?

MySQL中多表联查效率低的原因主要涉及到以下几个方面&#xff1a; 数据量大: 当多个表通过连接查询时&#xff0c;如果这些表的数据量很大&#xff0c;那么查询就需要处理更多的数据&#xff0c;这自然会降低查询效率。 连接操作复杂性: 连接查询需要对参与连接的每个表中的数…...

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…...

Redis(理论版)

Redis 1.Redis是什么 Redis其实就是一个数据库&#xff0c;它是一个文档型数据库&#xff08;非关系型数据库&#xff09;,而mysql是一个关系型数据库。它是一个开源的、基于内存的高性能键值存储数据库&#xff0c;支持多种数据结构&#xff0c;广泛用于缓存、消息队列、应用…...