Python跟踪车辆和TypeError整数

时间:2018-11-09 16:06:38

标签: python python-3.x numpy opencv

我正在这段代码中尝试识别车辆,并且一直都出错。我不知道为什么会产生这种错误。我正在阅读文档,但没有发现任何东西。请任何人帮助我。谢谢。

这是我无法解决的错误:

  

文件“ c:\ xampp \ htdocs \ DeteccionVehiculos \ detect.py”,第31行,位于diffLeftRight中       左= img [0:高度,0:半]   TypeError:切片索引必须为整数或无,或具有 index 方法

import cv2
import numpy as np
import math

def diffUpDown(img):
    # compare top and bottom size of the image
    # 1. cut image in two
    # 2. flip the top side
    # 3. resize to same size
    # 4. compare difference  
    height, width, depth = img.shape
    half = height/2
    top = img[0:half, 0:width]
    bottom = img[half:half+half, 0:width]
    top = cv2.flip(top,1)
    bottom = cv2.resize(bottom, (32, 64)) 
    top = cv2.resize(top, (32, 64))  
    return ( mse(top,bottom) )


def diffLeftRight(img):
    # compare left and right size of the image
    # 1. cut image in two
    # 2. flip the right side
    # 3. resize to same size
    # 4. compare difference  
    height, width, depth = img.shape
    half = width/2
    left = img[0:height, 0:half]
    right = img[0:height, half:half + half-1]
    right = cv2.flip(right,1)
    left = cv2.resize(left, (32, 64)) 
    right = cv2.resize(right, (32, 64))  
    return ( mse(left,right) )


def mse(imageA, imageB):
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    err /= float(imageA.shape[0] * imageA.shape[1])
    return err

def isNewRoi(rx,ry,rw,rh,rectangles):
    for r in rectangles:
        if abs(r[0] - rx) < 40 and abs(r[1] - ry) < 40:
           return False  
    return True

def detectRegionsOfInterest(frame, cascade):
    scaleDown = 2
    frameHeight, frameWidth, fdepth = frame.shape 

    # Resize redondeamos para prevenir errores
    frame = cv2.resize(frame, (math.floor(frameWidth/scaleDown), 
math.floor(frameHeight/scaleDown))) 
    frameHeight, frameWidth, fdepth = frame.shape 

    # haar detection.
    cars = cascade.detectMultiScale(frame, 1.2, 1)

    newRegions = []
    minY = int(frameHeight*0.3)

    # iterate regions of interest
    for (x,y,w,h) in cars:
            roi = [x,y,w,h]
            roiImage = frame[y:y+h, x:x+w]   

            carWidth = roiImage.shape[0]
            if y > minY:
                diffX = diffLeftRight(roiImage)
                diffY = round(diffUpDown(roiImage))

                if diffX > 1600 and diffX < 3000 and diffY > 12000:
                    rx,ry,rw,rh = roi
                    newRegions.append( 
[rx*scaleDown,ry*scaleDown,rw*scaleDown,rh*scaleDown] )

    return newRegions


def detectCars(filename):
    rectangles = []
    cascade = cv2.CascadeClassifier('../DeteccionVehiculos/cars.xml')
    vc = cv2.VideoCapture(filename)

    if vc.isOpened():
        rval , frame = vc.read()
    else:
        rval = False

    roi = [0,0,0,0]
    frameCount = 0

    while rval:
        rval, frame = vc.read()
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        frameHeight, frameWidth, fdepth = frame.shape 
        #Convertimos la imagen a un canal


        newRegions = detectRegionsOfInterest(frame, cascade)
        for region in newRegions:
            if isNewRoi(region[0],region[1],region[2],region[3],rectangles):
                rectangles.append(region)

        for r in rectangles:
            cv2.rectangle(frame,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]), (0,0,255),3) 

        frameCount = frameCount + 1
        if frameCount > 30: 
            frameCount = 0
            rectangles = []

        # show result
        cv2.imshow("Result",frame)
        cv2.waitKey(1);
    vc.release()

detectCars('../DeteccionVehiculos/road.mp4')

2 个答案:

答案 0 :(得分:1)

这是此行抛出的TypeErrorright = img[0:height, half:half + half-1]

请尝试将half + half-1括在方括号或int(half + half-1)中,因为它可能是浮点值。

答案 1 :(得分:1)

我认为您的一半可能是浮点值

half = height/2 
left = img[0:height, 0:half]

也许您将一个奇数除以2,然后查看您的身高值