Python opencv中的多已知目标检测与跟踪
我用显微镜观察4微米小珠子的运动。我有一个视频的珠子移动,我想处理视频提取珠子的位置作为时间的函数,以获得他们的运动数学模型 我目前正在使用opencv和python编程 我的代码是从文件中导入视频,对图像进行阈值化,然后应用HoughCircles变换来查找球形珠子Python opencv中的多已知目标检测与跟踪,python,c++,opencv,image-processing,tracking,Python,C++,Opencv,Image Processing,Tracking,我用显微镜观察4微米小珠子的运动。我有一个视频的珠子移动,我想处理视频提取珠子的位置作为时间的函数,以获得他们的运动数学模型 我目前正在使用opencv和python编程 我的代码是从文件中导入视频,对图像进行阈值化,然后应用HoughCircles变换来查找球形珠子 import numpy as np import cv2 def nothing(x): pass cap = cv2.VideoCapture('testvideo.mp4') cv2.namedWindow('t
import numpy as np
import cv2
def nothing(x):
pass
cap = cv2.VideoCapture('testvideo.mp4')
cv2.namedWindow('trackbar')
cv2.createTrackbar('Param1','trackbar',40,255,nothing)
cv2.createTrackbar('Param2','trackbar',10,255,nothing)
cv2.createTrackbar('MaxRadius','trackbar',18,255,nothing)
while(cap.isOpened()):
e1 = cv2.getTickCount()
ret, frame = cap.read()
#get grayscale image for HoughCircles
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
p1 = cv2.getTrackbarPos('Param1','trackbar')
p2 = cv2.getTrackbarPos('Param2','trackbar')
rMax = cv2.getTrackbarPos('MaxRadius','trackbar')
#Threshold grayscale image
ret,th1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#Find circles in image and store locations to circles list
circles = cv2.HoughCircles(th1, cv2.cv.CV_HOUGH_GRADIENT, 1, 10,
param1=p1, param2=p2,minRadius=0,
maxRadius=rMax)
#Hack for fixing the list if it is empty so program wont crash
if circles == None:
circles = [[[0,0,0.000],[0,0,0.000]]]
#convert circles list to integer list
circles = np.uint16(np.around(circles))
#store points to a file
datafile = file('datafile.txt', 'a')
np.savetxt(datafile, circles[0], fmt ='%i',delimiter=',', newline = ',')
datafile.write('\n')
datafile.close()
for i in circles[0,:]:
# draw the outer circle
cv2.circle(frame,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',frame)
cv2.imshow('threshold video',th1)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()
print time
cap.release()
cv2.destroyAllWindows()
这是我用来检测珠子的视频中的一个示例帧。
这里是一个单帧跟踪的例子,我使用了前面的算法
我不需要检测每一颗珠子。只要加一点就可以了
珠子是球形的,看起来应该是一样的,所以有没有一个库,我可以用来整合整个图像上的珠子图像,并查看图像中最相关的点?有时珠子会失焦,这就是为什么我现在的程序一直在跳转,给我珠子的误报
我最终需要这个过程实时发生,所以如果可能的话,最好让算法尽可能高效
如果有人知道解决这类问题的好方法,我们将不胜感激。珠子是否在Z轴上约束(或者换句话说,它们的大小是否会非常恒定)。他们从示例图像中查看,这让我想也能够指定大于零的最小半径。此外,您是否尝试跟踪单个珠子(或只是计算珠子的#或计算质量中心);这可能会影响建议的算法我正在尝试提取xy平面中珠子的运动。珠子在水溶液中,大部分是平放在xy平面上。珠子的大小是恒定的,但有时它们会聚集在一起,在这种情况下,我必须查看集群中的单个珠子,而不是将集群视为一个实体。目的是计算溶液中微珠的速度和温度。我想跟随溶液中的许多珠子,提取它们的x,y坐标。越多越好。你能分享视频的一小部分吗(不仅仅是一帧)?这将有助于更好地理解这个问题。您是否尝试过使用motempl示例的视频?这看起来(至少对这个睡眠不足的foon来说)接近你想要的(可能会调整一些参数);如果珠子聚集,您可能需要修改某些内容(例如,查找返回的大小是否超过半径,并对这些区域进行子扫描,尽管将聚集视为平均值似乎是可以接受的);正如Tomas指出的,一些框架可能有助于理解一些事情