草庐IT

Python OpenCV : Detecting a general direction of movement?

coder 2023-08-21 原文

我仍在编写书籍扫描脚本,现在,我所需要的只是能够自动检测翻页。这本书占据了 90% 的屏幕(我使用了一个粗糙的网络摄像头来检测运动),所以当我翻页时,运动的方向基本上是同一个方向。

我已经修改了一个运动跟踪脚本,但衍生品让我无处可去:

#!/usr/bin/env python

import cv, numpy

class Target:
    def __init__(self):
        self.capture = cv.CaptureFromCAM(0)
        cv.NamedWindow("Target", 1)

    def run(self):
        # Capture first frame to get size
        frame = cv.QueryFrame(self.capture)
        frame_size = cv.GetSize(frame)
        grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
        moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3)
        difference = None
        movement = []

        while True:
            # Capture frame from webcam
            color_image = cv.QueryFrame(self.capture)

            # Smooth to get rid of false positives
            cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0)

            if not difference:
                # Initialize
                difference = cv.CloneImage(color_image)
                temp = cv.CloneImage(color_image)
                cv.ConvertScale(color_image, moving_average, 1.0, 0.0)
            else:
                cv.RunningAvg(color_image, moving_average, 0.020, None)

            # Convert the scale of the moving average.
            cv.ConvertScale(moving_average, temp, 1.0, 0.0)

            # Minus the current frame from the moving average.
            cv.AbsDiff(color_image, temp, difference)

            # Convert the image to grayscale.
            cv.CvtColor(difference, grey_image, cv.CV_RGB2GRAY)

            # Convert the image to black and white.
            cv.Threshold(grey_image, grey_image, 70, 255, cv.CV_THRESH_BINARY)

            # Dilate and erode to get object blobs
            cv.Dilate(grey_image, grey_image, None, 18)
            cv.Erode(grey_image, grey_image, None, 10)

            # Calculate movements
            storage = cv.CreateMemStorage(0)
            contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
            points = []

            while contour:
                # Draw rectangles
                bound_rect = cv.BoundingRect(list(contour))
                contour = contour.h_next()

                pt1 = (bound_rect[0], bound_rect[1])
                pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
                points.append(pt1)
                points.append(pt2)
                cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1)

            num_points = len(points)

            if num_points:
                x = 0
                for point in points:
                    x += point[0]
                x /= num_points

                movement.append(x)

            if len(movement) > 0 and numpy.average(numpy.diff(movement[-30:-1])) > 0:
              print 'Left'
            else:
              print 'Right'

            # Display frame to user
            cv.ShowImage("Target", color_image)

            # Listen for ESC or ENTER key
            c = cv.WaitKey(7) % 0x100
            if c == 27 or c == 10:
                break

if __name__=="__main__":
    t = Target()
    t.run()

它检测所有框的平均中心的平均运动,这是非常低效的。我将如何快速准确地检测此类运动(即在阈值内)?

我正在使用 Python,并且我打算坚持使用它,因为我的整个框架都是基于 Python 的。

非常感谢您的帮助,在此先感谢大家。干杯。

最佳答案

我以前没有在 Python 中使用过 OpenCV,只是在 C++ 和 openframeworks 中使用过一点。

为此我假设 OpticalFlow的 velx,vely 属性会起作用。

有关光流如何工作的更多信息,请查看 this paper .

HTH

关于Python OpenCV : Detecting a general direction of movement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4496063/

有关Python OpenCV : Detecting a general direction of movement?的更多相关文章

  1. php - 在 htmlentities 中使用 php 5.4 的新常量 ENT_DISALLOWED - 2

    我试图以html编码的方式输出一个字符串,并且htmlentities()function总是返回一个空字符串。我很清楚为什么会这样。好吧,我没有运行PHP5.4我安装了最新的PHP5.3版本。问题是我将如何对具有无效代码单元序列的字符串进行htmlencode。根据手册,ENT_SUBSTITUTE是要走的路。但是这个常量在PHP5.3.X中没有定义。我这样做了:if(!defined('ENT_SUBSTITUTE')){define('ENT_SUBSTITUTE',8);}仍然没有运气。htmlentities仍然返回空字符串。我想试试ENT_DISALLOWED,但找不到它对

  2. php - htmlspecialchars & ENT_QUOTES 不工作? - 2

    基本上在显示来自MySQL数据库的数据时,我有一个htmlspecialchars()下面的函数应该将单引号和双引号转换为它们的安全实体。我遇到的问题是查看源代码,它只是转换&当我还需要它来转换单引号和双引号时。//sanitizedatafromdbbeforedisplayingonwebpagefunctionhtmlsan($htmlsanitize){return$htmlsanitize=htmlspecialchars($htmlsanitize,ENT_QUOTES,'UTF-8');}然后当我想使用例如我做的:htmlsan($row['comment']);谁能告诉

  3. php - 如何在 php 中为 htmlentities() 函数默认设置 ENT_QUOTES 标志 - 2

    我在显示之前对从数据库中获取的任何数据使用htmlentities($data,ENT_QUOTES)。有没有办法为htmlentities()函数默认设置标志ENT_QUOTES,这样即使我写htmlentities($data)它应该像htmlentities($data,ENT_QUOTES)一样工作。如php文档中所写,默认为ENT_COMPAT|ENT_HTML401.供您引用,我使用的是codeigniter框架php5。更新1:按照Michael的建议用自定义函数包装可能会有所帮助,但我已经在没有ENT_QUOTES标志的网站上到处使用它,并且想知道php是否提供了一种方

  4. php - LIBXML_NOENT 有什么作用(为什么不叫 LIBXML_ENT)? - 2

    在PHP中,可以将可选参数传递给各种XML解析器,其中之一是LIBXML_NOENT。documentation对此有话要说:LIBXML_NOENT(integer)SubstituteentitiesSubstituteentities提供的信息不是很多(什么实体?它们什么时候被替换?)。但我认为可以公平地假设NOENT是NO_ENTITIES或NO_EXTERNAL_ENTITIES的缩写,所以对我来说,这个标志似乎是一个公平的假设禁用(外部)实体的解析。但事实确实是:$xml=']>&c;';$dom=newDOMDocument();$dom->loadXML($xml,LI

  5. android - 如何以及何时使用通过 acquireUnstableContentProviderClient 获得的 ContentProviderClient? - 2

    使用通过ContentResolver#acquireContentProviderClient(...)获得的ContentProviderClient与ContentResolver#acquireUnstableContentProviderClient(...)有何不同?似乎无论使用哪种方法,我都会编写相同的代码。如果获取的ContentProvider消失并且我使用非不稳定方法获取客户端,我的应用程序是否会出现某种泄漏?所以我猜想如果您要使用的ContentProvider正在同一进程中运行,或者如果它正在system_server中运行,那么您可以继续使用稳定方法获取客户端

  6. android - AndEngine渲染纹理异常: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT - 2

    我开发了一款很多人玩的Android游戏。100-200名用户中有一名用户面临我无法理解的异常。我使用RenderTexture当我尝试初始化它时抛出以下异常:FatalException:org.andengine.opengl.exception.RenderTextureInitializationExceptionorg.andengine.opengl.exception.GLFrameBufferException:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT它适用于99%的所有设备。初始化方法如下所示:publicvoidinit(finalG

  7. 基于PythonOpenCv的视频图像处理 - 2

    博主简介博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c++,Python,爬虫等方面知识的分享。如果有需要的小伙伴可以关注博主,博主会继续更新的,如果有错误之处,大家可以指正。专栏简介: 本专栏主要研究python在人工智能方面的应用,涉及算法,案例实践。包括一些常用的数据处理算法,也会介绍很多的Python第三方库。如果需要,点击这里 订阅专栏。给大家分享一个我很喜欢的一句话:“每天多努力一点,不为别的,只为日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!”初识OpenCVOpenCV是一个开源的,跨平台的计算机视觉库,它采用优化

  8. 基于PythonOpenCv的视频图像处理 - 2

    博主简介博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c++,Python,爬虫等方面知识的分享。如果有需要的小伙伴可以关注博主,博主会继续更新的,如果有错误之处,大家可以指正。专栏简介: 本专栏主要研究python在人工智能方面的应用,涉及算法,案例实践。包括一些常用的数据处理算法,也会介绍很多的Python第三方库。如果需要,点击这里 订阅专栏。给大家分享一个我很喜欢的一句话:“每天多努力一点,不为别的,只为日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!”初识OpenCVOpenCV是一个开源的,跨平台的计算机视觉库,它采用优化

随机推荐