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

OpenCV-Python中的图像处理-视频分析

OpenCV-Python中的图像处理-视频分析

  • 视频分析
    • Meanshift算法
    • Camshift算法
    • 光流
      • Lucas-Kanade Optical Flow
      • Dense Optical Flow

视频分析

学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象:

Meanshift算法

Meanshift 算法的基本原理是和很简单的。假设我们有一堆点(比如直方
图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗
口移动到最大灰度密度处(或者是点最多的地方)。如下图所示:
在这里插入图片描述
初始窗口是蓝色的“C1”,它的圆心为蓝色方框“C1_o”,而窗口中所有点质心却是“C1_r”(小的蓝色圆圈),很明显圆心和点的质心没有重合。所以移动圆心 C1_o 到质心 C1_r,这样我们就得到了一个新的窗口。这时又可以找到新窗口内所有点的质心,大多数情况下还是不重合的,所以重复上面的操作:将新窗口的中心移动到新的质心。就这样不停的迭代操作直到窗口的中心和其所包含点的质心重合为止(或者有一点小误差)。按照这样的操作我们的窗口最终会落在像素值(和)最大的地方。如上图所示“C2”是窗口的最后位址,我们可以看出来这个窗口中的像素点最多。
要在 OpenCV 中使用 Meanshift 算法首先我们要对目标对象进行设置,
计算目标对象的直方图,这样在执行 meanshift 算法时我们就可以将目标对
象反向投影到每一帧中去了。另外我们还需要提供窗口的起始位置。在这里我
们值计算 H( Hue)通道的直方图,同样为了避免低亮度造成的影响,我们使
用函数 cv2.inRange() 将低亮度的值忽略掉。

import numpy as np
import cv2
from matplotlib import pyplot as plt
# 视频下载地址https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4
cap = cv2.VideoCapture('./resource/opencv/video/slow_traffic_small.mp4')ret,frame = cap.read()# setup initial location of window
x, y, w, h = 300, 200, 100, 50 # simply hardcoded the values
track_window = (x, y, w, h)# set up the ROI for tracking
roi = frame[y:y+h, x:x+w]hsv_roi = cv2.cvtColor(frame, 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)term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)while(1):ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)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)k = cv2.waitKey(60)&0xFFif k == 27:breakelse:cv2.imshow('img', img2)else:breakcap.release()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

Camshift算法

与 Meanshift 基本一样,但是返回的结果是一个带旋转角度的矩形以及这个矩形的参数(被用到下一次迭代过程中)。

import numpy as np
import cv2
from matplotlib import pyplot as plt
# 视频下载地址https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4
cap = cv2.VideoCapture('./resource/opencv/video/slow_traffic_small.mp4')# take first frame of the video
ret, frame = cap.read()# setup initial location of window
x, y, w, h = 300, 200, 100, 50 # simply hardcoded the values
track_window = (x, y, w, h)
# set up the ROI for tracking
roi = frame[y:y+h, x:x+w]
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)
# Setup the termination criteria, either 10 iteration or move by at least 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )while(1):ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)# apply camshift to get the new locationret, track_window = cv2.CamShift(dst, track_window, term_crit)# Draw it on imagepts = cv2.boxPoints(ret)pts = np.int0(pts)img2 = cv2.polylines(frame,[pts],True, 255,2)k = cv2.waitKey(30) & 0xffif k == 27:breakelse:cv2.imshow('img2',img2)else:cap.release()cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

光流

Lucas-Kanade Optical Flow

  • 光流的概念以及 Lucas-Kanade 光流法
  • 函数 cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪
import numpy as np
import cv2cap = cv2.VideoCapture('./resource/opencv/video/slow_traffic_small.mp4')# params for Shi-Tomasi corner detection
feature_params = dict(maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7)# parameters for lucas kanade optical flow
# maxLevel 为使用的图像金字塔层数
lk_params = dict(winSize = (15,15),maxLevel = 2,criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# Create some random colors
color = np.random.randint(0, 255, (100, 3))# Take first frame and find corners in it
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)while(1):ret, frame = cap.read()frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# calculate optical flow 能够获取点的新位置p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# Select good pointsgood_new = p1[st==1]good_old = p0[st==1]# draw the tracksfor i,(new, old) in enumerate(zip(good_new, good_old)):a,b = new.ravel()c,d = old.ravel()mask = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2)frame = cv2.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1)img = cv2.add(frame, mask)cv2.imshow('frame', img)k = cv2.waitKey(30) & 0xFFif k == 27:breakold_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)cv2.destroyAllWindows()
cap.release()

在这里插入图片描述

Dense Optical Flow

import numpy as np
import cv2 as cvcap = cv.VideoCapture('./resource/opencv/video/vtest.avi')
ret, frame1 = cap.read()
prvs = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[..., 1] = 255
while(1):ret, frame2 = cap.read()if not ret:print('No frames grabbed!')breaknext = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)flow = cv.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)mag, ang = cv.cartToPolar(flow[..., 0], flow[..., 1])hsv[..., 0] = ang*180/np.pi/2hsv[..., 2] = cv.normalize(mag, None, 0, 255, cv.NORM_MINMAX)bgr = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)cv.imshow('frame2', bgr)k = cv.waitKey(30) & 0xffif k == 27:breakelif k == ord('s'):cv.imwrite('./resource/opencv/video/opticalfb.png', frame2)cv.imwrite('./resource/opencv/video/opticalhsv.png', bgr)prvs = next
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

相关文章:

OpenCV-Python中的图像处理-视频分析

OpenCV-Python中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流Lucas-Kanade Optical FlowDense Optical Flow 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆…...

STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX STM32 CubeMX (第四步Freertos内存管理和CPU使用率) STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)使用STM32 CubeMX 库,配置Fr…...

题解 | #1012.Equalize the Array# 2023杭电暑期多校10

1012.Equalize the Array 签到 题目大意 定义一个数组的 m o d e mode mode 是其中出现次数最多的数字(可不唯一) 给定一个数组 a a a ,每次操作可以选定其一个 m o d e mode mode 并使数组中所有与之相等的元素 1 1 1 问任意次操作后…...

UE4/5C++多线程插件制作(二十一、使用)

目录 DemoPawn.h DemoPawn.cpp 会出现的bug 插件 相关的插件制作在上一节已经完成了。 具体的使用方式在第0章已经写了,get之后去绑定即可。 而后笔者做了一个接口,具体的绑定方式也就在这个接口里面。 接下来最重要的是进行使用,对此我做了一个与蓝图相关的接口,里…...

【C#】关于?的用法

1、可空类型修饰符(?) 如: int? x null;//可空类型默认值都是null,而值类型如int默认值为0、bool默认值为false等 bool? result true;2、三目运算符(?:) 如: bool…...

linux——mysql的高可用MHA

目录 一、概述 一、概念 二、组成 三、特点 四、工作原理 二、案例 三、构建MHA 一、基础环境 二、ssh免密登录 三、主从复制 master slave1 四、MHA安装 一、环境 二、安装node 三、安装manager 一、概述 一、概念 MHA(MasterHigh Availability&a…...

【学习日记】【FreeRTOS】空闲任务与阻塞延时

写在前面 本文是基于野火 RTOS 教程对空闲任务和阻塞延时的详解。 一、什么是任务中的阻塞延时 说到阻塞延时,笔者的第一反应就是在单片机的 while 循环中,使用一个 for 循环不断递减一个大数,通过 CPU 不断执行一条指令的耗时进行延时。这…...

衣服材质等整理(时常更新)

参考文章&图片来源 https://zhuanlan.zhihu.com/p/390341736 00. 天然纤维 01. 化学纤维 02. 聚酯纤维(即,涤纶) 一种由有机二元酸和二元醇通过化学缩聚制成的合成纤维。具有出色的抗皱性和保形性,所制衣物在穿着过程中不容…...

电子商务环境下旅游价值链

迈克尔 ・ 波特(Michael E. Porter)在其《竞争优势》一书中提出了“价值链” 的概念,并认为一家企业最核心的竞争优势在于对价值链的设计。虽然迈克尔 ・ 波 特提出的价值链主要是针对企业内部的价值链,但他视价值链为一系列连续完成的 活动&#xff…...

spring源码分析bean的生命周期(下)

doGetBean()执行过程 createBean()执行过程 一、DependsOn注解 spring创建对象之前会判断类上是否加了DependsOn注解,加了会遍历然后会添加到一个map中,spring会先创建DependsOn注解指定的类 二、spring类加载器 在合并BeanDefinition,确定…...

完美解决Github提交PR后报错:File is not gofumpt-ed (gofumpt)

问题阐述 最近在Github上提交PR后,遇到了这么一个问题:golangci-lint运行失败,具体原因是File is not gofumpt-ed (gofumpt)。 名词解释 golangci-lint: golangci-lint 是Go语言社区中常用的代码质量检查工具,它可以…...

pytorch3d成功安装

一、pytorch3d是什么? PyTorch3D的目标是帮助加速深度学习和3D交叉点的研究。3D数据比2D图像更复杂,在从事Mesh R-CNN和C3DPO等项目时,我们遇到了一些挑战,包括3D数据表示、批处理和速度。我们开发了许多有用的算子和抽象&#xf…...

【vue3】同个页面引入多个图表组件实现自适应的方法

首先说明,此方案仅针对vue3项目在同一个页面引入了多个图表组件,因为我发现不能框架不同的引入,resize的写法还不同 window.addEventListener("resize", function() {...// 在此处重新调用即可 }以下是具体写法: 循环…...

一文了解汽车芯片的分类及用途介绍

汽车芯片按其功能可分为控制类(MCU和AI芯片)、功率类、传感器和其他(如存储器)四种类型。市场基本被国际巨头所垄断。人们常说的汽车芯片是指汽车里的计算芯片,按集成规模可分为MCU芯片和AI芯片(SoC芯片&am…...

Linux0.11内核源码解析-truncate.c

truncate文件只要实现释放指定i节点在设备上占用的所有逻辑块,包括直接块、一次间接块、二次间接块。从而将文件节点对应的文件长度截为0,并释放占用的设备空间。 索引节点的逻辑块连接方式 释放一次间接块 static void free_ind(int dev,int block) {…...

LED驱动型IC芯片的原理介绍

一、LED驱动器是什么 LED驱动器(LED Driver),是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定,它能适应的电源电压和电流变动范围十分狭窄,稍许偏离就可能无法点亮LED或者发光效…...

VLAN实验

实验题目如下: 实验拓扑如下: 实验要求如下: 【1】PC1/3的接口均为access模式,且属于van2,在同一网段 【2】PC2/4/5/6的IP地址在同一网段,与PC1/3不在同一网段 【3】PC2可以访问4/5/6,PC4不能…...

Qt应用开发(基础篇)——高级纯文本窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…...

三维可视化平台有哪些?Sovit3D可视化平台怎么样?

随着社会经济的发展和数字技术的进步,互联网行业发展迅速。为了适应新时代社会发展的需要,大数据在这个社会经济发展过程中随着技术的进步而显得尤为重要。同时,大数据技术的快速发展进程也推动了可视化技术的飞速发展,国内外各类…...

Xxl-job安装部署以及SpringBoot集成Xxl-job使用

1、安装Xxl-job: 可以使用docker拉取镜像部署和源码编译两种方式,这里选择源码编译安装。 代码拉取地址: https://github.com/xuxueli/xxl-job/tree/2.1.2 官方开发文档: https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%…...

3分钟让你的Windows任务栏焕然一新:TranslucentTB完全指南

3分钟让你的Windows任务栏焕然一新:TranslucentTB完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在为Windows单调…...

别再死记硬背排序了!‘原地哈希’如何用交换搞定特定数组排序(保姆级图解)

别再死记硬背排序了!‘原地哈希’如何用交换搞定特定数组排序(保姆级图解) 每次提到排序算法,你的第一反应是不是快速排序、归并排序这些经典方法?但面对特定场景的数组排序,这些"大炮打蚊子"式的…...

从限速到全速:ctfileGet如何彻底改变城通网盘下载体验

从限速到全速:ctfileGet如何彻底改变城通网盘下载体验 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 清晨的阳光透过窗户洒在设计师小李的电脑屏幕上,他正焦急地等待着一个500M…...

ARM Cortex-M3位带操作原理与W55MH32 GPIO实战应用

1. 从51到ARM:为什么我们需要“位带操作”?如果你是从51单片机转过来玩ARM Cortex-M3内核的,比如WIZnet这颗W55MH32,那你肯定对sbit P1_0 P1^0;这种写法再熟悉不过了。在51上,想单独控制一个IO口的高低电平&#xff0…...

2026 断桥铝系统门窗选购指南:品牌综合实力榜与技术选型要点

2026 断桥铝系统门窗选购指南:品牌综合实力榜与技术选型要点行业发展背景与产品技术迭代中国住宅装饰装修产业正向品质化、精细化与绿色化深度转型,居住者对建筑外围护结构的综合性能要求持续攀升。传统非系统化断桥铝门窗因结构设计单一、性能指标离散、…...

基于RK3568J核心板的隔离网闸设计:硬件选型、系统架构与工程实践

1. 项目概述:当嵌入式核心板遇上网络安全“守门员”最近几年,“科技与狠活”这个词火遍全网,让大家对各种产品的成分和安全性都多了一份审视。其实,除了我们吃进嘴里的东西,另一个看不见摸不着却至关重要的领域——网络…...

成都口碑好的特斯拉专修公司有哪些

在成都,如果你是特斯拉车主,寻找一家靠谱的专修公司是非常重要的。今天就给大家推荐一家口碑极佳的特斯拉专修公司——TBA特斯拉专修(成都三业店),也就是成都市三业汽车服务有限责任公司。下面从多个方面来看看它的优势…...

MPLAB Harmony 2.0固件框架:从MISRA-C合规到图形化开发的嵌入式开发新范式

1. 项目概述:为什么我们需要一个“全功能”的固件框架?如果你和我一样,在PIC32单片机的世界里摸爬滚打过几年,肯定经历过这样的场景:项目启动,面对Microchip提供的海量外设库、驱动代码和中间件&#xff0c…...

UltraScale架构FPGA功耗优化技术与工程实践

1. UltraScale架构的功耗优化技术全景解析在当今高性能计算和通信领域,功耗已成为FPGA选型的决定性因素之一。Xilinx UltraScale架构通过多层次的创新,在20nm工艺节点上实现了显著的功耗降低。作为深耕FPGA设计十余年的工程师,我将从实际应用…...

ARM PMU中断控制寄存器PMINTENCLR/PMINTENSET详解

1. ARM性能监控单元(PMU)架构概述 在现代处理器设计中,性能监控单元(Performance Monitoring Unit, PMU)是实现系统级性能分析和优化的关键组件。ARM架构从v7开始引入标准化的PMU设计,并在v8/v9架构中持续演进。PMU的核心功能是通过一组可编程事件计数器…...