首页 > 其他分享 >(8-3)盲点检测:光流法

(8-3)盲点检测:光流法

时间:2024-04-02 21:32:05浏览次数:15  
标签:Kanade Lucas 检测 cv2 盲点 光流 算法 图像 光流法

8.3  光流法

光流法是计算机视觉中一种用于估计图像中像素运动的技术,它基于一系列图像帧之间的亮度信息变化,通过跟踪同一场景中的特征点,计算这些特征点在时间上的运动轨迹。光流法在很多应用中都有重要的作用,例如目标跟踪、运动分析、视觉里程计等。光流法的基本假设是,场景中相邻的图像点在连续帧之间的亮度值保持不变。光流可以用向量场表示,其中每个向量代表了一个点在两帧之间的位移。光流的计算可以通过不同的算法实现,其中一种常用的是Lucas-Kanade方法。

8.3.1  Lucas-Kanade算法

Lucas-Kanade(LK)光流算法是一种用于计算图像中局部运动的经典光流算法,该算法基于亮度恒定假设,即场景中相邻像素的亮度在短时间内保持不变。Lucas-Kanade算法主要用于跟踪图像中的特征点,估计这些特征点在连续帧之间的运动。

Lucas-Kanade算法的基本思想是在每个特征点周围采用局部的二阶泰勒展开,然后通过最小二乘法求解一个由光流场引起的误差最小的位移向量。实现Lucas-Kanade算法的具体步骤如下所示。

(1)选择特征点:在图像中选择需要跟踪的特征点。

(2)建立局部窗口:对每个特征点周围建立一个局部窗口,窗口的大小可以根据具体情况而定。

(3)计算空间梯度:在窗口内计算每个像素点的空间梯度,通常使用Sobel算子等方法。

(4)计算时间梯度:在时间维度上计算特征点在图像序列中的亮度变化。

(5)构建雅可比矩阵:利用空间梯度和时间梯度,构建雅可比矩阵,描述光流场对亮度变化的影响。

(6)求解最小二乘问题:利用最小二乘法,求解一个由光流场引起的误差最小的位移向量。

Lucas-Kanade算法的优点在于其简单性和计算效率,适用于近似局部恒定运动的场景。然而,它对于较大的光流和非恒定亮度变化的情况可能表现不佳。在实际应用中,可以结合金字塔法等技术来提高算法的稳健性和适用性。请看下面的例子,演示了使用Lucas-Kanade算法进行光流估计的过程,并在移动的车辆图像中标记运动的区域。

实例5-8使用Lucas-Kanade算法进行光流估计codes/5/lk.py

实例文件lk.py的具体实现代码如下所示。

# 读取图像
img = cv2.imread('car.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 选择特征点
p0 = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)

# Lucas-Kanade参数
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# 光流法计算
p1, status, err = cv2.calcOpticalFlowPyrLK(gray, gray, p0, None, **lk_params)

# 筛选跟踪失败的点
good_new = p1[status == 1]
good_old = p0[status == 1]

# 在图像上绘制运动区域
for i, (new, old) in enumerate(zip(good_new, good_old)):
    a, b = np.int32(new.ravel())  # 将坐标转换为整数类型
    c, d = np.int32(old.ravel())
    cv2.line(img, (a, b), (c, d), (0, 255, 0), 2)
    cv2.circle(img, (a, b), 5, (0, 255, 0), -1)

# 显示结果
cv2.imshow('Lucas-Kanade for Motion Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码的实现流程如下所示:

(1)首先,通过cv2.goodFeaturesToTrack选择图像中的一些特征点,这些特征点将被用于后续的Lucas-Kanade算法。

(2)然后,定义Lucas-Kanade算法的参数,包括窗口大小、金字塔层数和终止条件。

(3)接着,利用cv2.calcOpticalFlowPyrLK计算特征点在同一图像上的运动,得到新的特征点位置(p1)、状态(status)和误差(err)。在接下来的步骤中,筛选出成功跟踪的特征点,得到good_new和good_old。

(4)最后,在图像上绘制运动区域。通过遍历成功跟踪的特征点,使用cv2.line绘制运动轨迹,同时使用cv2.circle标记每个特征点的当前位置。这样,能够在图像中观察到运动区域的估计效果。

8.3.2  Farneback光流算法

Farneback光流算法是一种用于计算光流场的密集光流方法,与Lucas-Kanade算法不同,Farneback光流算法通过对整个图像中的每个像素点进行处理,得到一个密集的光流场,表示图像中每个位置的运动信息。该算法由Gunnar Farneback在2003年提出,是一种基于多项式展开的方法。

实现Farneback光流算法的主要步骤如下所示。

(1)构建图像金字塔:对输入图像构建一系列图像金字塔,通过多次降采样获得不同分辨率的图像。

(2)计算光流场:在金字塔的每一层上,通过多项式展开来逼近局部的像素运动。通过对这些展开系数的计算,得到每个像素点的光流矢量。

(3)合并光流场:将不同层次的光流场进行合并,得到最终的密集光流场。

Farneback适用于一定程度的图像变化和非线性的运动,在处理一些复杂场景下能够提供比较鲁棒的光流估计。请看下面的例子,使用Farneback光流算法估计光流场,并在图像中标记光流场的运动区域。

实例5-8使用Farneback光流算法在图像中标记运动区域codes/5/fb.py

实例文件fb.py的具体实现代码如下所示。

# 读取图像
img = cv2.imread('car.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 计算光流场
flow = cv2.calcOpticalFlowFarneback(prev=gray, next=gray, flow=None, pyr_scale=0.5, levels=5, winsize=11, iterations=5, poly_n=5, poly_sigma=1.1, flags=0)

# 计算光流场的幅值和角度
magnitude, angle = cv2.cartToPolar(flow[..., 0], flow[..., 1])

# 通过降低阈值来筛选运动区域
threshold = 0.1
motion_mask = magnitude > threshold

# 在图像上标记运动区域
motion_image = np.zeros_like(img)
motion_image[motion_mask] = [0, 0, 255]  # 在运动区域绘制红色

# 获取运动区域的坐标
motion_coords = np.column_stack((np.where(motion_mask)))

# 在图像上标记运动方向
for coord in motion_coords:
    x, y = coord
    if 0 <= x < img.shape[1] and 0 <= y < img.shape[0]:  # 确保坐标在图像内
        dx, dy = flow[y, x]
        cv2.arrowedLine(img, (x, y), (int(x + dx), int(y + dy)), (0, 255, 0), 2)

# 合并原始图像和标记的运动区域
result = cv2.addWeighted(img, 1, motion_image, 0.5, 0)

# 显示结果
cv2.imshow('Enhanced Motion Detection using Farneback Optical Flow', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码的实现流程如下所示:

  1. 首先,读取汽车行驶图像并将其转换为灰度图像,然后利用Farneback光流法计算光流场。
  2. 接着,通过计算光流场的幅值,筛选出运动区域。这里使用了一个阈值,只保留幅值大于阈值的部分,形成二值掩码。
  3. 然后,从运动区域的二值掩码中获取坐标信息,表示为(motion_coords)。
  4. 接下来,在原始图像上标记运动区域,将运动区域绘制为红色。
  5. 最后,遍历运动区域的坐标,获取对应位置的光流矢量,并使用箭头标记运动方向。在这一步中,代码确保坐标不会超出图像边界,避免数组越界错误。
  6. 最终,将标记运动区域和箭头标记的图像与原始图像进行合并,形成最终的结果图像,并显示在屏幕上。

标签:Kanade,Lucas,检测,cv2,盲点,光流,算法,图像,光流法
From: https://blog.csdn.net/asd343442/article/details/137290787

相关文章

  • VL25 输入序列连续的序列检测
    解析:本题目较为简单,有两种思路,一种是状态机方法,一种是移位寄存器方法,因为题目未要求使用哪种方法,因此这里采用较为简洁的移位寄存器方法。//--------------------------------------------------------------------------------------------------------//Module:sequence......
  • 高精度、低功耗、小封装电压检测芯片 HXWSEMI桦芯微HX61CC2202MR、HX61CC2702MR、HX61
    HX61C系列芯片是使用CMOS技术开发的高精度、低功耗、小封装电压检测芯片。检测电压在小温度漂移的情况下保持极高的精度。客户可选择CMOS输出或OpenDrain输出。■产品特点高精度:±2%低功耗:2.0µA(Vin=1.5V)检测电压范围:1.0V~6.0V,100mV步进工作电压范围:0.7V......
  • 基于深度学习的疲劳检测算法
    摘要:为了实现对驾驶员驾驶状态的检测预警,避免发生交通事故。提出了一种基于改进多任务级联卷积神经网络(Multi-TaskConvolutionalNeuralNetworks,MTCNN)人脸检测及多特征融合的疲劳检测方法。算法利用改进的MTCNN进行人脸检测和面部9个特征点定位;基于特征点确定出嘴巴、眼睛......
  • YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![
    ​专栏介绍:YOLOv9改进系列|包含深度学习最新创新,助力高效涨点!!!专栏介绍    YOLOv9作为最新的YOLO系列模型,对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型,使用当前流行和较新的模块进行改进。本专栏于2024年2月29日晚创建,预计四......
  • (10-2)目标检测:基于YOLO的目标检测
    10.2基于YOLO的目标检测YOLO(YouOnlyLookOnce)是一种基于深度学习的目标检测算法,它具有实时性和高准确性的特点。YOLO算法通过单个神经网络同时完成目标定位和分类,以极高的速度在图像或视频中检测多个目标物体。YOLOv5是YOLO算法的一个版本,它在原始的YOLO算法基础上进行了......
  • SonarQube代码质量静态检测
    一、Sonar简介官网:https://www.sonarqube.org/sonar是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,而且能够集成在IDE、Jenkins、Git等服务中,方便随时查看代码质量分析报告;sonar通过配置的代码分析规则,从可靠性、安全性、可维护性、覆盖......
  • 基于51单片机智能手腕计步器步数体温检测OLED显示设计20-418
    20-418、51手腕计步器设计-ADXL345-DS18B20-OLED-BELL产品功能描述:本系统由STC89C52单片机+ADXL345加速度传感器+DS18B20温度检测电路+0.96寸OLED液晶显示屏电路+蜂鸣器报警电路+电源电路组成。1、通过ADXL345检测步数,通过DS18B20检测温度。2、0.96寸OLED液晶实时显示步数......
  • 什么库是检测未使用和简化代码在python中?
    什么库是检测未使用和简化代码在python?什么是python的Vulture呢?功能:Vulture是一个用于静态分析Python代码的库,专门用于检测未使用的代码。它可以帮助你识别项目中未被引用的函数、类、变量或导入模块,并帮助简化代码结构.使用方法:首先,安装Vulture库:pip install......
  • 监听检测页面长时间未操作后事件
    代码写于App.vue页面,相当于全局监听,每个路由是被包含在div中的!<template><divid="app"@click="clickDiv"><router-view></router-view></div></template><script>exportdefault{name:"App",da......
  • 电池充电器上架亚马逊的检测标准是什么?怎么办理?
    电池充电器上架亚马逊的标准是UL1310认证。UL认证又分为很多种其中亚马逊常见的UL标准和测试内容?电源适配器UL60950-1测试报告;UL60950-1是IT类电源的一个北美安规标准,主要是针对电源的温升、耐压、绝缘等提出的要求。不同的产品,不同的地区有不同的安规标准;锂电池组UL2054测......