我可以使用Python中的OpenCV從我的攝像頭獲取幀。 camshift示例接近我想要的,但我不想要人爲干預來定義對象。我想獲得在幾幀的過程中改變的總像素的中心點,即移動物體的中心。如何使用Python中的OpenCV跟蹤動作?
回答
我得從C版本的代碼在博客中發現了一些翻譯工作代碼Motion Detection using OpenCV:
#!/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()
有一些視頻在http://appdelegateinc.com/blog/2010/08/02/motion-tracking-with-a-webcam/ – 2010-08-03 02:39:51
謝謝爲你的代碼。它的工作原理,它可以檢測到所有的移動物體。但是,它無法跟蹤移動的對象。有沒有更好的跟蹤移動物體的方法?我想要計算每個輪廓的中心,可以比較兩幀之間的位置變化,但最難的部分是,如果一幀中有很多輪廓,並且非常接近,很難說出一個輪廓,是下一幀中的下一個輪廓。 – qkzhu 2012-12-25 10:00:18
自從我使用OpenCV以來已經有一段時間了,但我記得使用包含在源代碼中的演示,您可以在其中使用鼠標拖動一個正方形周圍的對象進行跟蹤。它抓住選擇的顏色直方圖並尋找它。我相信這是這段代碼:https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/python/camshift.py?rev=2136 – 2012-12-27 22:13:28
查看論壇帖子Motion tracking using OpenCV。
我相信你能夠閱讀和翻譯源代碼到Python,對吧?
我給它一個嘗試,讓你知道。 – 2010-08-01 05:06:52
我將它轉換爲Python,但恐怕每次調用CalcOpticalFlowPyrLK後都會得到相同的點。有任何想法嗎?這裏是我的代碼:http://friendpaste.com/7lM9Cmiyif1fIVwrgKBJnG – 2010-08-01 07:32:00
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));
這是我試圖讓中心的部分代碼當使用矩形邊界進行跟蹤時,移動對象的位置。
下面的鏈接跟蹤移動的車輛以及對它們進行計數。它基於OpenCV,用Python 2.7編寫。
OpenCV and Python
- 1. Python OpenCV跟蹤點
- 2. 使用Opencv Python跟蹤多個對象
- 3. 使用OpenCV跟蹤運動(Python中的cv2)
- 4. 如何跟蹤使用OpenCV和Python的blob
- 5. 使用opencv跟蹤矩形
- 6. 如何在C++中使用手部跟蹤移動光標opencv
- 7. 使用Raspberry pi 3,OpenCV和Python的運動跟蹤器
- 8. OpenCV中的對象跟蹤
- 9. 如何跟蹤opencv python中的不同輪廓
- 10. 使用光流的OpenCV跟蹤
- 11. 問題:使用opencv在python中進行單個對象跟蹤
- 12. 紅外LED跟蹤:使用OpenCV跟蹤x,y,z位置
- 13. 使用OpenCV進行眼動跟蹤驅動的虛擬電腦鼠標python lkdemo
- 14. 人臉跟蹤OpenCV
- 15. OpenCV人體跟蹤
- 16. OpenCV + python紅球檢測和跟蹤
- 17. Opencv跟蹤的運動檢測
- 18. 使用opencv進行Android角落跟蹤
- 19. 使用OpenCV進行物體跟蹤
- 20. 使用opencv跟蹤車輛軌跡
- 21. Python,函數如何跟蹤操作?
- 22. 如何檢測和跟蹤使用OpenCV的人?
- 23. 使用特徵探測器的OpenCV運動跟蹤
- 24. 使用opencv跟蹤移動車輛的可能方法
- 25. 如何跟蹤python導入
- 26. 如何跟蹤文件中的行python
- 27. 使用併發線程跟蹤動作
- 28. 如何在使用Opencv關閉Python代碼之後保存跟蹤欄值?
- 29. 如何跟蹤移動對象的軌跡openCV C++
- 30. 如何使用iPhone的相機跟蹤動作?
http://stackoverflow.com/questions/3374422/how-do-i-track-a-blob-using-opencv-and-python的問題情境 – 2010-07-30 19:52:58