Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python opencv中的多已知目标检测与跟踪_Python_C++_Opencv_Image Processing_Tracking - Fatal编程技术网

Python opencv中的多已知目标检测与跟踪

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

我用显微镜观察4微米小珠子的运动。我有一个视频的珠子移动,我想处理视频提取珠子的位置作为时间的函数,以获得他们的运动数学模型

我目前正在使用opencv和python编程

我的代码是从文件中导入视频,对图像进行阈值化,然后应用HoughCircles变换来查找球形珠子

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指出的,一些框架可能有助于理解一些事情