opencv3/Python 稠密光流calcOpticalFlowFarneback详解

OpenCV3/Python稠密光流calcOpticalFlowFarneback详解

稠密光流是计算机视觉中的一个重要问题,它可以用来估计图像中每个像素的运动。OpenCV供了多种稠密光流算法,其中calcOpticalFlowFarneback是一种常用的方法。本攻略将详细讲解如何使用OpenCV3和Python实现calcOpticalFlowFarneback算法,并提供两个示例。

步骤一:导入库

在使用OpenCV3和Python实现calcOpticalFlowFarneback算法之前,我们需要先导入相关的库。下面是一个简单的示例:

import cv2
import numpy as np

在上面的代码中,我们导入了OpenCV和NumPy库。

步骤二:读取视频

在使用OpenCV3和Python实现calcOpticalFlowFarneback算法之前,我们需要先读取视频。下面是一个简单的示例:

# 读取视频
cap = cv2.VideoCapture('test.mp4')

# 获取第一帧
ret, frame1 = cap.read()

# 转换为灰度图像
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

在上面的代码中,我们使用cv2.VideoCapture方法读取视频,然后使用cap.read方法获取第一帧图像。接着,我们使用cv2.cvtColor方法将图像转换为灰度图像。

步骤三:计算稠密光流

在读取视频之后,我们可以使用OpenCV3和Python计算稠密光流。下面是一个简单的示例:

# 计算稠密光流
while(1):
    ret, frame2 = cap.read()
    if ret:
        next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
        flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
        # 可视化稠密光流
        hsv = np.zeros_like(frame2)
        hsv[...,1] = 255
        mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
        hsv[...,0] = ang*180/np.pi/2
        hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
        bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
        cv2.imshow('frame2',bgr)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
        # 更新前一帧
        prvs = next
    else:
        break

在上面的代码中,我们使用cv2.calcOpticalFlowFarneback方法计算稠密光流,并使用cv2.cartToPolar将光流向量转换为极坐标形式。接着,使用cv2.normalize方法将光流强度归一化到0-255之间,并使用cv2.cvtColor方法将图像从HSV颜色空间转换为BGR颜色空间。最后,我们使用cv2.imshow方法显示可视化的稠密光流,并使用cv2.waitKey方法等待用户按下ESC键退出程序。

示例一:稠密光流跟踪运动目标

下面是一个稠密光流跟踪运动目标的示例:

# 读取视频
cap = cv2.VideoCapture('test.mp4')

# 获取第一帧
ret, frame1 = cap.read()

# 转为灰度图像
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

# 定义ROI
r,h,c,w = 250,90,400,125
track_window = (c,r,w,h)

# 设置追踪器参数
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

# 计算稠密光流
while(1):
    ret, frame2 = cap.read()
    if ret:
        next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
        flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
        # 可视化稠密光流
        hsv = np.zeros_like(frame2)
        hsv[...,1] = 255
        mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
        hsv[...,0] = ang*180/np.pi/2
        hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
        bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
        cv2.imshow('frame2',bgr)
        # 追踪运动目标
        if c > 0 and r > 0 and w > 0 and h > 0:
            roi = bgr[r:r+h, c:c+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)
            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_window
            img2 = cv2.rectangle(bgr, (x,y), (x+w,y+h), 255,2)
            cv2.imshow('img2',img2)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
        # 更新前一帧
        prvs = next
    else:
        break

在上面的代码中,我们首先定义了一个ROI,然后使用cv2.inRange方法将ROI中的像素转换为二进制掩码。接着,我们使用cv2.calcHist方法计算ROI的颜色直方图,并使用cv2.normalize方法将直方图归一化到0-255之间。然后,使用cv2.calcBackProject方法计算反向投图,并使用cv2.meanShift方法追踪运动目标。最后,我们使用cv2.rectangle方法在图像中绘制矩形框,以标记运动目标。

示例二:稠密光流估计相机运动

下面是一个使用稠密光流估计相机运动的示例:

# 读取视频
cap = cv2.VideoCapture('test.mp4')

# 获取第一帧
ret, frame1 = cap.read()

# 转换为灰度图像
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

# 计算稠密光流
while(1):
    ret, frame2 = cap.read()
    if ret:
        next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
        flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
        # 可视化稠密光流
        hsv = np.zeros_like(frame2)
        hsv[...,1] = 255
        mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
        hsv[...,0] = ang*180/np.pi/2
        hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
        bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
        cv2.imshow('frame2',bgr)
        # 估计相机运动
        M = np.zeros((2,3))
        M[0,0] = 1
        M[1,1] = 1
        M[1,2] = np.mean(flow[...,0])
        M[0,2] = np.mean(flow[...,1])
        frame2 = cv2.warpAffine(frame2,M,(frame2.shape[1],frame2.shape[0]))
        cv2.imshow('frame2',frame2)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
        # 更新前一帧
        prvs = next
    else:
        break

在上面的代码中,我们使用np.mean方法计算光流向量的平均值,并使用cv2.warpAffine方法估计相机运动。最后,我们使用cv2.imshow方法显示估计的相机运动。

总结

本攻略详细解了如何使用OpenCV3和Python实现calcOpticalFlowFarneback算法,并提供了两个示例。在实际编程中,我们可以根据具体的需求选择合适的稠密光流算法和参数,以提高稠密光流的准确率和鲁棒性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:opencv3/Python 稠密光流calcOpticalFlowFarneback详解 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • numpy找出array中的最大值,最小值实例

    以下是关于“numpy找出array中的最大值、最小值实例”的完整攻略。 背景 在NumPy中,可以使用max()和min()函数来查找数组中的最大值和最小值。在本攻略中,我们将介绍如何使用这些函数来查找数组中的最大值和最小值。 实现 查找最大值 可以使用max()函数来查找数组中的最大值。以下是一个示例,展示如何使用max()函数查找数组中的最大值: im…

    python 2023年5月14日
    00
  • 零基础怎样才能系统快速的学会Python

    当你没有任何编程经验时,学习Python可能会感到有些困难。但是,只要你掌握了正确的学习方法和技巧,就可以快速掌握Python的基础知识和语法。以下是零基如何系统快速学习Python的完整攻略,包含两个示例。 1. 学习Python的基础知识 在学习之前,需要掌握一些基础知识,例如计算机编程的基本概念、数据类型、变量、运算符、条件语、循环句等。可以通过阅读相…

    python 2023年5月14日
    00
  • Python 机器学习库 NumPy入门教程

    Python机器学习库NumPy入门教程 简介 NumPy是Python中一个非常流行的数值计算库,它提供了许多常用的数学函数和工具。NumPy的主要特点是它支持高效的数组操作和广播功能,这使得它成为了许多科学计算和机器学习任务的首选库。本攻略将详细讲解如何使用NumPy进行数值计算和数组操作。 安装 在使用NumPy之前,我们需要先安装它。可以使用以下命令…

    python 2023年5月13日
    00
  • python中numpy 常用操作总结

    Python中Numpy常用操作总结 Numpy是Python中一个非常强大的数学库,它提供了许多高效的数学函数和工具,特别是对于数组和矩阵的处理。下面是Python中Numpy常操作的总结。 安装Numpy 在使用Numpy之前,需要先安装它。可以使用以下命令在终端中安装Numpy: pip install numpy 导入Numpy 在Python中,我…

    python 2023年5月13日
    00
  • Pyorch之numpy与torch之间相互转换方式

    PyTorch之Numpy与Torch之间相互转换方式 在PyTorch中,我们经常需要将Numpy数组转换为Torch张量,或将Torch张量转为Numpy数组。本攻略将详细讲解如实现这过程。 Numpy数组转换为Torch张量 我们可以使用PyT中的torch.from_numpy()函数将Numpy数组换为Torch量。下面是一个将Numpy数组转换为…

    python 2023年5月13日
    00
  • 11个Python Pandas小技巧让你的工作更高效(附代码实例)

    Pandas是Python中一个非常流行的数据处理库,可以用于数据清洗、数据分析、数据可视化等。在使用Pandas时,有一些小技巧可以让您的工作更高效。以下是11个Python Pandas小技巧的完整攻略,包括代码实现的步骤和示例说明: 读取CSV文件 import pandas as pd df = pd.read_csv(‘data.csv’) 这个示…

    python 2023年5月14日
    00
  • Numpy之文件存取的示例代码

    以下是关于“Numpy之文件存取的示例代码”的完整攻略。 文件存取的概念 NumPy提供了一些函数用于将数组保存到磁盘文件中,并从磁盘文件中读取数组。这些函数使得我们可以在不丢失数据的情况下,将数组在不同的程序之间传递。 将数组保存到文件中 下面是一个将数组保存到文件中的示例代码: import numpy as np # 创建一个一维数组 a = np.a…

    python 2023年5月14日
    00
  • Anaconda入门使用总结

    Anaconda入门使用总结 Anaconda是一个用于数据科学和机器学习的开源发行版,它包含了Python、R语言、Jupyter Notebook等常用工具和库。本文将介绍如何安装和使用Anaconda,以及如何创建和管理虚拟环境。 安装Anaconda 首先,我们需要从Anaconda官网下载适合自己操作系统的安装包。下载完成后,双击安装包并按照提示进…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部