如何在Python中使用OpenCV跟踪运动?
我可以使用Python从我的网络摄像头获取帧。camshift示例接近我想要的,但我不希望人为干预来定义对象。我想得到在几帧的过程中改变的总像素的中心点,即移动对象的中心。参见论坛帖子如何在Python中使用OpenCV跟踪运动?,python,opencv,Python,Opencv,我可以使用Python从我的网络摄像头获取帧。camshift示例接近我想要的,但我不希望人为干预来定义对象。我想得到在几帧的过程中改变的总像素的中心点,即移动对象的中心。参见论坛帖子 我相信您能够阅读源代码并将其翻译为,对吗?我已经从博客文章中找到的代码版本中翻译了一些工作代码: 这是代码的一部分,当使用矩形边界进行跟踪时,我试图获取移动对象的中心。以下链接跟踪移动的车辆并对其进行计数。它基于OpenCV,是用Python 2.7编写的。 对于问题上下文,我将尝试一下,并让您知道。我将其转换
我相信您能够阅读源代码并将其翻译为,对吗?我已经从博客文章中找到的代码版本中翻译了一些工作代码:
这是代码的一部分,当使用矩形边界进行跟踪时,我试图获取移动对象的中心。以下链接跟踪移动的车辆并对其进行计数。它基于OpenCV,是用Python 2.7编写的。
对于问题上下文,我将尝试一下,并让您知道。我将其转换为Python,但恐怕每次调用CalCopticalFlowPyrk后都会得到相同的分数。有什么想法吗?这是我的密码:谢谢你的密码。它工作正常,可以检测到所有移动的物体。但是,它不能跟踪运动目标。有没有更好的跟踪运动物体的方法?我正在考虑计算每个轮廓的中心,可以比较两帧之间的位置变化,但困难的是,如果一帧中有许多轮廓,并且非常接近,很难区分一个轮廓,这是下一帧中的下一个轮廓。我使用OpenCV已经有一段时间了,但我记得使用了源代码附带的一个演示,您可以用鼠标在对象周围拖动一个正方形来跟踪。它获取选择的颜色直方图并查找它。我相信这是一段代码:是否可以使用这个脚本,同时将color_图像用作mjpeg网络流。我希望能够在连接到的PC上监控摄像头,同时从我的Android手机上查看视频流。我还没有尝试过,但粗略的谷歌搜索会发现类似这样的代码在OpenCV 3.2版中不起作用。我试着把它弄得乱七八糟,但我遇到了很多麻烦。您是否有此代码的更新版本,可以与我们共享?
#!/usr/bin/env python
import cv
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)
color_image = cv.CreateImage(cv.GetSize(frame), 8, 3)
grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
moving_average = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_32F, 3)
first = True
while True:
closest_to_left = cv.GetSize(frame)[0]
closest_to_right = cv.GetSize(frame)[1]
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 first:
difference = cv.CloneImage(color_image)
temp = cv.CloneImage(color_image)
cv.ConvertScale(color_image, moving_average, 1.0, 0.0)
first = False
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 people blobs
cv.Dilate(grey_image, grey_image, None, 18)
cv.Erode(grey_image, grey_image, None, 10)
storage = cv.CreateMemStorage(0)
contour = cv.FindContours(grey_image, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
points = []
while contour:
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)
if len(points):
center_point = reduce(lambda a, b: ((a[0] + b[0]) / 2, (a[1] + b[1]) / 2), points)
cv.Circle(color_image, center_point, 40, cv.CV_RGB(255, 255, 255), 1)
cv.Circle(color_image, center_point, 30, cv.CV_RGB(255, 100, 0), 1)
cv.Circle(color_image, center_point, 20, cv.CV_RGB(255, 255, 255), 1)
cv.Circle(color_image, center_point, 10, cv.CV_RGB(255, 100, 0), 1)
cv.ShowImage("Target", color_image)
# Listen for ESC key
c = cv.WaitKey(7) % 0x100
if c == 27:
break
if __name__=="__main__":
t = Target()
t.run()
if faces:
for ((x, y, w, h), n) in faces:
pt1 = (int(x * image_scale), int(y * image_scale))
pt2 = (int((x + w) * image_scale), int((y + h) * image_scale))
ptcx=((pt1[0]+pt2[0])/2)/128
ptcy=((pt1[1]+pt2[1])/2)/96
cv.Rectangle(gray, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0)
print ptcx;
print ptcy;
b=('S'+str(ptcx)+str(ptcy));