opencv 未检测到 Cv2.rectangle 函数,cv2.boundingRect() 等其他函数也未检测到

问题描述 投票:0回答:1

[这是我的程序]

import cv2
cam = cv2.VideoCapture(0)
while True:
    ret, frame1 = cam.read()
    ret, frame2 = cam.read()
    diff = cv2.absdiff(frame1, frame2)
    gray = cv2.cvtColor(diff, cv2.COLOR_RGB2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
    dilated = cv2.dilate(thresh, None, iterations=3)
    contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # cv2.drawContours(frame1, contours, -1, (0, 255, 0), 2)
    for c in contours:
        if cv2.contourArea(c) < 5000:
            continue
            x, y, w, h = cv2.boundingRect(c)
            cv2.rectangle(frame1, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow('My came', frame1)
    if cv2.waitKey(10) == ord('t'):
        break

正如你所理解的,我基本上是在尝试使用 opencv 在 python 中制作一个带有警报的运动检测系统,稍后我将添加该警报。 我的主要问题是未检测到矩形函数 或者在编写代码时建议。由于我对此很陌生,我无法理解此错误的原因是什么。 我正在关注一个名为“编程英雄”的频道的 YouTube 教程。

我自己无法做太多事情来纠正我的错误。 当我写到第 12 行和最后三行时,程序运行良好(这意味着我的每一个最小的动作都用给定的颜色绘制了轮廓),这显然是需要的。

但是就在我从第 13-17 行写入之后(原因-所以,只有更大的运动才会被检测到并用矩形包围),然后我运行程序,但现在,只有我的网络摄像头打开,没有矩形可见。 而且在编写矩形函数时也没有显示任何建议。 朋友,您的帮助将不胜感激..

python opencv
1个回答
0
投票

opencv未检测到Cv2.rectangle函数,其他函数也未检测到 就像 cv2.boundingRect()

如你所知,我基本上是在尝试进行运动检测 使用带有警报的 opencv 的 python 系统,稍后我将添加该警报。 我的主要问题是矩形函数未被检测到或 写代码时建议

你没有做正确的事。

我尝试着解决问题。

您需要将

frame1
frame2

分开

减少了这个:

if cv2.contourArea(c) < 5000:

致:

if cv2.contourArea(c) < 50:

因此,您可以在人类移动或静止时检测运动。

片段(已修改):

import cv2
cap=cv2.VideoCapture(0)

ret1,frame1 = cap.read()
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
gray1 = cv2.GaussianBlur(gray1, (21, 21), 0)
cv2.imshow('window',frame1)

while cap.isOpened():
    ret2, frame2 = cap.read()
    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.GaussianBlur(gray2, (21, 21), 0)
    
    deltaframe = cv2.absdiff(gray1, gray2)
    cv2.imshow('delta', deltaframe)
    threshold = cv2.threshold(deltaframe, 25, 255, cv2.THRESH_BINARY)[1]
    threshold = cv2.dilate(threshold,None)
    cv2.imshow('threshold',threshold)
    countour, heirarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for i in countour:
        if cv2.contourArea(i) < 50:
            continue
 
        (x, y, w, h) = cv2.boundingRect(i)
        cv2.rectangle(frame2, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
    cv2.imshow('window', frame2)
    
    if cv2.waitKey(20) == ord('q'):
      break
cap.release()
cv2.destroyAllWindows()
© www.soinside.com 2019 - 2024. All rights reserved.