python中使用opencv_如何在Python中使用OpenCV跟踪运动?

本文介绍了一段使用Python编写的代码,实现摄像头捕获实时画面,通过Canny边缘检测、轮廓跟踪技术来定位并标记目标。代码展示了如何创建颜色和灰度图像,进行平滑处理、大小判断、移动平均滤波等步骤,最终在屏幕上显示目标位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我已经从博客文章中找到的C版本的代码中翻译了一些工作代码:#!/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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值