Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 3.x Opencv3-如何根据轮廓和矩形为我统计的人提供ID?_Python 3.x_Opencv_Opencv3.0_Tracking_Counting - Fatal编程技术网

Python 3.x Opencv3-如何根据轮廓和矩形为我统计的人提供ID?

Python 3.x Opencv3-如何根据轮廓和矩形为我统计的人提供ID?,python-3.x,opencv,opencv3.0,tracking,counting,Python 3.x,Opencv,Opencv3.0,Tracking,Counting,我想给我在上面画矩形的轮廓区域ID。现在,我的代码跟踪屏幕上移动的对象,并在其周围放置一个矩形。我想给每个矩形一个ID。我知道如何计算屏幕上有多少个矩形,但我不知道如何给矩形一个准确的ID,当另一个矩形加入屏幕时,该ID不会改变 我用于绘制矩形的代码: video_path = 'C:\\Users\\MONSTER\\Desktop\\video.avi' cv2.ocl.setUseOpenCL(False) version = cv2.__version__.split('.')[0]

我想给我在上面画矩形的轮廓区域ID。现在,我的代码跟踪屏幕上移动的对象,并在其周围放置一个矩形。我想给每个矩形一个ID。我知道如何计算屏幕上有多少个矩形,但我不知道如何给矩形一个准确的ID,当另一个矩形加入屏幕时,该ID不会改变

我用于绘制矩形的代码:

video_path = 'C:\\Users\\MONSTER\\Desktop\\video.avi'
cv2.ocl.setUseOpenCL(False)

version = cv2.__version__.split('.')[0]
print(version) 

#read video file
cap = cv2.VideoCapture(video_path)

#check opencv version
if version == '2' :
    fgbg = cv2.BackgroundSubtractorMOG2()
if version == '3': 
    fgbg = cv2.createBackgroundSubtractorMOG2()


while (cap.isOpened):

    #if ret is true than no error with cap.isOpened
    ret, frame = cap.read()

    if ret==True:

        #apply background substraction
        fgmask = fgbg.apply(frame)
        ret1,th1 = cv2.threshold(fgmask,150,200,cv2.THRESH_BINARY)              
        #check opencv version
        if version == '2' : 
            (contours, hierarchy) = cv2.findContours(th1.copy(), 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        if version == '3' : 
        (im2, contours, hierarchy) = cv2.findContours(th1.copy(), 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        if cv2.contourArea(c) < 200:
            continue

        #get bounding box from countour
        (x, y, w, h) = cv2.boundingRect(c)

        #draw bounding box
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow('foreground and background',th1)
    cv2.imshow('rgb',frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()
video\u路径='C:\\Users\\MONSTER\\Desktop\\video.avi'
cv2.ocl.setUseOpenCL(错误)
version=cv2.\uuuuuuuuuuuuuuuuu版本\uuuuuuuuuu.split('.')[0]
印刷品(版本)
#读取视频文件
cap=cv2.视频捕获(视频路径)
#检查opencv版本
如果版本==“2”:
fgbg=cv2.BackgroundSubtractorMOG2()
如果版本==“3”:
fgbg=cv2.createBackgroundSubtractorMOG2()
而(盖等厚):
#如果ret为真,则cap.ISOPEND没有错误
ret,frame=cap.read()
如果ret==True:
#应用背景减法
fgmask=fgbg.apply(帧)
ret1,th1=cv2.阈值(fgmask,150200,cv2.阈值_二进制)
#检查opencv版本
如果版本==“2”:
(等高线,层次)=cv2.findContours(th1.copy(),
cv2.外部翻新,cv2.链条(近似简单)
如果版本==“3”:
(im2,轮廓,层次)=cv2.FindOntours(th1.copy(),
cv2.外部翻新,cv2.链条(近似简单)
对于等高线中的c:
如果cv2.轮廓面积(c)<200:
持续
#从countour获取边界框
(x,y,w,h)=cv2.boundingRect(c)
#绘制边界框
cv2.矩形(框架,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow(“前景和背景”,th1)
cv2.imshow('rgb',帧)
如果cv2.waitKey(1)&0xFF==ord(“q”):
打破
第1章释放()
cv2.destroyAllWindows()
我将上面的代码改为下面的代码,将文本放在矩形上,但是当另一个矩形连接时,文本会发生变化

i = 1
        for c in contours:
            if cv2.contourArea(c) < 200:
                continue

            #get bounding box from countour
            (x, y, w, h) = cv2.boundingRect(c)

            #draw bounding box
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            i = i + 1
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(frame,str(i),(x,y), font, 2,(255,255,255),2,cv2.LINE_AA)
i=1
对于等高线中的c:
如果cv2.轮廓面积(c)<200:
持续
#从countour获取边界框
(x,y,w,h)=cv2.boundingRect(c)
#绘制边界框
cv2.矩形(框架,(x,y),(x+w,y+h),(0,255,0),2)
i=i+1
font=cv2.font\u HERSHEY\u SIMPLEX
cv2.putText(框架,str(i),(x,y),字体,2,(255255),2,cv2.LINE_AA)

你有没有办法给矩形一个准确的ID。

你的代码不会跟踪。仅从背景进行检测。要使您的代码以本机方式进行跟踪,恐怕没有那么简单。只有当您有一个完美连接的对象并且只有一个对象时,才会发生跟踪。它通常很少发生,因为故障检测一直在发生。这样就创建了多个RECT

当您进入场景时,ID将保持不同帧的更改,并且存在多个检测,如下图所示。我以前试过。每次边界矩形都会随着对象的变化而变化。特别是当您使用像bgfg这样的简单方法时,几乎每一帧都会发生这种丢失轨迹或丢失id的情况

正确的方法是使用真实跟踪算法不断更新对象。e、 g

TLD跟踪器的输入来自通过以下方式获得的Rect

(x, y, w, h) = cv2.boundingRect(c)
源代码在github中。请随意测试它

https://github.com/gnebehay/TLD
按照安装步骤进行安装,并将其集成到当前的检测路由中

https://github.com/zk00006/OpenTLD/wiki/Installation

您的代码不进行跟踪。仅从背景进行检测。要使您的代码以本机方式进行跟踪,恐怕没有那么简单。只有当您有一个完美连接的对象并且只有一个对象时,才会发生跟踪。它通常很少发生,因为故障检测一直在发生。这样就创建了多个RECT

当您进入场景时,ID将保持不同帧的更改,并且存在多个检测,如下图所示。我以前试过。每次边界矩形都会随着对象的变化而变化。特别是当您使用像bgfg这样的简单方法时,几乎每一帧都会发生这种丢失轨迹或丢失id的情况

正确的方法是使用真实跟踪算法不断更新对象。e、 g

TLD跟踪器的输入来自通过以下方式获得的Rect

(x, y, w, h) = cv2.boundingRect(c)
源代码在github中。请随意测试它

https://github.com/gnebehay/TLD
按照安装步骤进行安装,并将其集成到当前的检测路由中

https://github.com/zk00006/OpenTLD/wiki/Installation

您需要跟踪多个对象

  • 您需要检查它们的交点,并在它们碰撞时停止跟踪

您需要跟踪多个对象

  • 您需要检查它们的交点,并在它们碰撞时停止跟踪