Python 如何在检测到的人体轮廓周围放置边界框

Python 如何在检测到的人体轮廓周围放置边界框,python,opencv,bounding-box,background-subtraction,Python,Opencv,Bounding Box,Background Subtraction,以下是我编写的python代码:- import cv2 import argparse ap = argparse.ArgumentParser() ap.add_argument("-v", "--video", help = "path to the (optional) video file") args = vars(ap.parse_args()) if not args.get("video", False): cap = cv2.VideoCapture(0) els

以下是我编写的python代码:-

import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
help = "path to the (optional) video file")
args = vars(ap.parse_args())

if not args.get("video", False):
    cap = cv2.VideoCapture(0)
else:
    cap = cv2.VideoCapture(args["video"])
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
while True:
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

如何在检测到的人体轮廓周围放置边界框,并提高python代码的效率,以便在从网络摄像头获取的实时视频提要上执行背景减法。有人能帮忙吗?

你可以使用findContours

import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
help = "path to the (optional) video file")
args = vars(ap.parse_args())

if not args.get("video", False):
    cap = cv2.VideoCapture(0)
else:
    cap = cv2.VideoCapture(args["video"])
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
while True:
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)

    mask = 255 - fgmask
    _, contours, _ = cv2.findContours(
        mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    fgmask = cv2.cvtColor(fgmask, cv2.COLOR_GRAY2BGR)
    for contour in contours:
        area = cv2.contourArea(contour)

        #only show contours that match area criterea
        if area > 500 and area < 20000:
            rect = cv2.boundingRect(contour)
            x, y, w, h = rect
            cv2.rectangle(fgmask, (x, y), (x+w, y+h), (0, 255, 0), 3)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
导入cv2
导入argparse
ap=argparse.ArgumentParser()
添加参数(“-v”,“视频”,
help=“指向(可选)视频文件的路径”)
args=vars(ap.parse_args())
如果不是args.get(“视频”,False):
cap=cv2.视频捕获(0)
其他:
cap=cv2.VideoCapture(args[“video”])
fgbg=cv2.bgsegm.createBackgroundSubtractorMOG()
尽管如此:
ret,frame=cap.read()
fgmask=fgbg.apply(帧)
掩码=255-fgmask
_,等高线,=cv2.findContours(
面罩,cv2.RETR_树,cv2.CHAIN_近似值(无)
fgmask=cv2.cvt颜色(fgmask,cv2.COLOR_GRAY2BGR)
对于等高线中的等高线:
面积=cv2。轮廓面积(轮廓)
#仅显示符合面积标准a的轮廓
如果面积大于500且面积小于20000:
rect=cv2.边界rect(轮廓)
x、 y,w,h=rect
cv2.矩形(fgmask,(x,y),(x+w,y+h),(0255,0),3)
cv2.imshow(“帧”,fgmask)
k=cv2。等待键(30)和0xff
如果k==27:
打破
第1章释放()
cv2.destroyAllWindows()

我已经测试了视频

使用背景减法绘制轮廓

import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
help = "path to the (optional) video file")
args = vars(ap.parse_args())

if not args.get("video", False):
    cap = cv2.VideoCapture(0)
else:
    cap = cv2.VideoCapture(args["video"])
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
while True:
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)

    gray=cv2.cvtColor(fgmask,cv2.COLOR_BGR2GRAY)
    ret,th1 = cv2.threshold(gray,25,255,cv2.THRESH_BINARY)
    _,contours,hierarchy = cv2.findContours(th1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 1000 and area < 40000:
            x,y,w,h = cv2.boundingRect(cnt)
            cv2.rectangle(fgmask,(x,y),(x+w,y+h),(255,0,0),2)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

请格式化您的代码,使其成为有效的Python代码。这个@Christoph Terasa好吗?请帮帮我。我是个新手。@Ritwik从fgmask中找到人类的轮廓并绘制相应的边界框。我该怎么做?您可以编写任何链接或代码吗?@Ritwik,不,此代码没有多大意义。但这是抛出的错误:-frame=cv2.imread(frame)TypeError:内置操作的参数类型不正确请勿执行frame=cv2.imread(frame)。我想我写错了。只需删除此步骤您是否正在执行第二个步骤?
import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
help = "path to the (optional) video file")
args = vars(ap.parse_args())

if not args.get("video", False):
    cap = cv2.VideoCapture(0)
else:
    cap = cv2.VideoCapture(args["video"])
    fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
while True:
    ret, frame = cap.read()

    frame = cv2.imread(frame)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    lower = np.array([50,103,40])
    upper = np.array([255,255, 255])

    mask = cv2.inRange(hsv, lower, upper)
    fg = cv2.bitwise_and(frame, frame, mask=255-mask)

    fg = cv2.cvtColor(fg.copy(),cv2.COLOR_HSV2BGR)
    fg = cv2.cvtColor(fg,cv2.COLOR_BGR2GRAY)

    fg = cv2.threshold(fg, 120,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
    #plt.imshow(fg)
    #plt.show()


    fgclosing = cv2.morphologyEx(fg.copy(), cv2.MORPH_CLOSE, kernel)
    se = np.ones((3,3),np.uint8)
    #fgdilated = cv2.morphologyEx(fgclosing, cv2.MORPH_CLOSE,cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4,4)))
    fgdilated = cv2.dilate(fgclosing, kernel = se , iterations = 8)

    img = frame.copy()
    ret, threshed_img = cv2.threshold(fgdilated,
                    127, 255, cv2.THRESH_BINARY)
    image, contours, hier = cv2.findContours(threshed_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

    for cnt in contours:
        #print(cv2.contourArea(cnt))
        if cv2.contourArea(cnt) > 44000:
            # get convex hull
            hull = cv2.convexHull(cnt)
            #cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)
            #print(hull)
            (x,y,w,h) = cv2.boundingRect(cnt)
            #cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 0), 2)
            contours = hull
            #c1 = max(contours, key=cv2.contourArea)
            hull = cv2.convexHull(cnt)
            c = hull
            #print(c)
            cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)
            # determine the most extreme points along the contour
            extLeft = tuple(c[c[:, :, 0].argmin()][0])
            extRight = tuple(c[c[:, :, 0].argmax()][0])
            extTop = tuple(c[c[:, :, 1].argmin()][0])
            extBot = tuple(c[c[:, :, 1].argmax()][0])

            cv2.drawContours(img, [c], -1, (0, 255, 255), 2)
            cv2.circle(img, extLeft, 8, (0, 0, 255), -1)
            cv2.circle(img, extRight, 8, (0, 255, 0), -1)
            cv2.circle(img, extTop, 8, (255, 0, 0), -1)
            cv2.circle(img, extBot, 8, (255, 255, 0), -1)

            lx = extLeft[1]
            ly = extLeft[0]
            rx = extRight[1]
            ry = extRight[0]
            tx = extTop[1]
            ty = extTop[0]
            bx = extBot[1]
            by = extBot[0]   

            x,y = lx,by
            w,h = abs(rx-lx),abs(ty-by)

            #cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 0), 2)
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(img,str(extLeft[0])+','+str(extLeft[1]),(extLeft), font, 2,(0, 0, 255),2,cv2.LINE_AA)
            cv2.putText(img,str(extRight[0])+','+str(extRight[1]),(extRight), font, 2,(0, 255, 0),2,cv2.LINE_AA)
            cv2.putText(img,str(extTop[0])+','+str(extTop[1]),(extTop), font, 2,(255, 0, 0),2,cv2.LINE_AA)
            cv2.putText(img,str(extBot[0])+','+str(extBot[1]),(extBot), font, 2,(255, 255, 0),2,cv2.LINE_AA)

            im = frame[tx:bx,ly:ry,:]
            cx = im.shape[1]//2
            cy = im.shape[0]//2
            cv2.circle(im, (cx,cy), 15, (0, 255, 0))

    plt.imshow(img)
    plt.show()