私は今でも本のスキャンスクリプトをハッキングしていますが、今のところ私が必要とするのは、自動的にページめくりを検出できることです。この本は画面の90%を占めています(私は動き検出のために粗いウェブカムを使用しています)ので、ページをめくるとき、動きの方向は基本的に同じ方向です。Python OpenCV:一般的な移動方向を検出していますか?
私は、モーショントラッキングスクリプトを変更したが、誘導体は、どこにも私を取得されていません:
#!/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に基づいているので、それに固執するつもりです。
お手数をおかけしますが、よろしくお願いいたします。乾杯。
本当にモーショントラッキングが必要ですか?何らかの閾値以上の変化を検出するだけではどうですか? (つまり、sum(abs(img2 - img1))> threshold'の行に沿ったもの) –
うーん、私はそれを試してみよう。しかし、ページが前進したのか、後退したのか、さらに悪いのか、途中で戻ったのか、戻ったのかはどうすれば分かりますか?私はグラフを使って遊んでいきます。それが私の仕事です。ありがとう! – Blender
ああ、本当に、私はあなたがページが変わったことを知る必要があると仮定しました...あなたが方向を知る必要があるなら、上の私のコメントは良い選択肢ではありません! –