gpt4 book ai didi

Python OpenCV : Detecting a general direction of movement?

转载 作者:太空狗 更新时间:2023-10-29 21:10:24 25 4
gpt4 key购买 nike

我仍在编写书籍扫描脚本,现在,我所需要的只是能够自动检测翻页。这本书占据了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com