繁体   English   中英

检测活动物体时如何删除多个帧

How to remove multiple frames when detecting live objects

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已经编写了一个代码,可以通过使用HSV颜色代码来检测MCB的尺寸。 但是,当我运行程序时,我达到了预期的输出,但是在检测到的对象周围还有3个其他帧。 虽然输出文本数据设置为一帧,但我仍然无法漫游其他3个无意义的帧。 我想问一下如何删除它们的任何建议。

我设置轮廓数据以检测HSV代码的最大区域,但是仍然无法正常工作。

附上代码提供的屏幕快照,以获得更好的主意。

输出图像

代码如下:

import cv2
from collections import deque
from scipy.spatial import distance as dist
from imutils import perspective
import numpy as np
import argparse
import imutils
import math
import time

font = cv2.FONT_HERSHEY_SIMPLEX

def midpoint(ptA, ptB):
    return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)

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

sensitivity = 43
greyLower = np.array([96,0,176-sensitivity])
greyUpper = np.array([180,sensitivity,255])
pixelsPerMetric = None
KNOWN_WIDTH = 19

if not args.get("video", False):
    camera = cv2.VideoCapture(0)
else:
    camera = cv2.VideoCapture(args["video"])

while True:
    (grabbed, frame) = camera.read()

    if args.get("video") and not grabbed:
        break

    frame = imutils.resize(frame, width=600)
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    mask = cv2.inRange(hsv,greyLower, greyUpper)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)

    (_, contours, hierarchy) = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    center = None
    for pic, contour in enumerate(contours):

        if len(contours) > 0:
            contour = max(contours, key =cv2.contourArea)
            x,y,w,h = cv2.boundingRect(contour)
            rect = (x+w, y+h)
            rect = cv2.minAreaRect(contour)
            box = cv2.boxPoints(rect)
            box = np.int0(box)
            box = perspective.order_points(box)
            M = cv2.moments(contour)
            for (x, y) in box:
                M = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
            # unpack the ordered bounding box, then compute the midpoint
            # between the top-left and top-right coordinates, followed by
            # the midpoint between bottom-left and bottom-right coordinates
            (tl, tr, br, bl) = box
            (tltrX, tltrY) = midpoint(tl, tr)
            (blbrX, blbrY) = midpoint(bl, br)

            # compute the midpoint between the top-left and top-right points,
            # followed by the midpoint between the top-righ and bottom-right
            (tlblX, tlblY) = midpoint(tl, bl)
            (trbrX, trbrY) = midpoint(tr, br)

            # draw the midpoints on the image
            cv2.circle(M, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)
            cv2.circle(M, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)
            cv2.circle(M, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)
            cv2.circle(M, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)

            # draw lines between the midpoints
            cv2.line(M, (int(tltrX), int(tltrY)), (int(blbrX), int(blbrY)),
                    (255, 0, 255), 2)
            cv2.line(M, (int(tlblX), int(tlblY)), (int(trbrX), int(trbrY)),
                    (255, 0, 255), 2)
            # compute the Euclidean distance between the midpoints
            dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))
            dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))

            # if the pixels per metric has not been initialized, then
            # compute it as the ratio of pixels to supplied metric
            # (in this case, inches)

            # compute the size of the object
            dimA = dA / KNOWN_WIDTH
            dimB = dB / KNOWN_WIDTH

            if rect >300:
                    frame = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
                    cv2.putText(frame,"MCB",(x,y),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,139))

            # draw the object sizes on the image
            cv2.putText(frame, "{:.1f}cm".format(dimA),
                    (int(tltrX - 15), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,
                    0.65, (255, 255, 255), 2)
            cv2.putText(frame, "{:.1f}cm".format(dimB),
                    (int(trbrX + 10), int(trbrY)), cv2.FONT_HERSHEY_SIMPLEX,
                    0.65, (255, 255, 255), 2)
    cv2.imshow("Frame", frame)

    key = cv2.waitKey(10) & 0xFF

    if key == ord("q"):
        break

camera.release()
cv2.destroyAllWindows()

请任何建议将是有益的,并在此先感谢您,加油!

问题暂未有回复.您可以查看右边的相关问题.
1 检测何时单击多个Ellipse对象

我正在开发Squares游戏的一个版本。 为此,我需要检测何时单击“椭圆”。 但是问题是我的方法是使用一个Ellipse对象。 如何检测单击哪个椭圆? 这是我的代码。 大广场类 } SquaresPanel类 多谢你们! 将 ...

2 将多个实时流转换为帧

我想从多个流中获取帧并将它们存储在文件System中 。 ffmpeg中是否有任何规定通过提及不同的输入源在单个命令中执行此操作? 我尝试使用以下命令: 但是上面的命令仅从1个流创建帧。 ...

2019-01-09 09:08:21 0 9   ffmpeg
3 如何在检测对象时移除/删除边界框?

我将 TensorFlow 用于我的对象检测任务,但有时它会显示误报。所以我想过滤一些边界框。 例如,如果对象的边界框的宽度小于整个屏幕的 50%,则显示该框: 但是,它不起作用。 它仍然显示所有边界框。 我试图比较整个屏幕区域的区域,但它也不起作用。 来自错误奶牛检测的图像。 简而言之,如 ...

4 渲染具有多帧的类对象时不显示 Tkinter 图像

我在 python3 中使用 Tkinter 创建了一个桌面应用程序。 应用程序有一个主类对象“堆栈”,其中有一个函数,用于渲染多个帧,以便在按钮单击事件时导航到应用程序内的其他窗口。 我正在尝试使用 PIL.ImageTk/PIL.Image 在“主页”屏幕(实际上所有页面都作为标题)上显示图像 ...

5 如何维护多个框架和多个对应对象之间的数据绑定?

我正在开发一个UWP应用程序,该应用程序本质上是几个相同对象的控制面板-我们称它们为Plate对象。 从功能上讲,用户需要能够创建和删除具有特定属性的Plate对象,并且所有当前可用的Plate对象及其相应的唯一属性以及用于修改它们的控件都显示在主页上。 我实现它们的方式是在主页上创 ...

6 使函数返回多个对象时如何删除索引括号?

我正在尝试使用函数来减少代码行,但我的输出并不像我想要的那么干净。 具体来说,当从函数返回多个元素时(通过创建列表并使用return ),R 还会打印我认为是索引号的内容(例如[[1]][[1]][[1]] )。 为了让我的 Markdown 文档更清晰、更易读,我想删除那些小数字。 关于如何做到 ...

7 使用VNCoreMLRequest一次检测多个对象?

我已经设置好了VNCoreMLRequest 该请求返回一个该请求认为正在查看的数组,列表中的第一项是最佳猜测。 我想知道是否有一种方法可以使用这项技术同时检测多个唯一对象? 如果我要同时在框架中放一个苹果和一个香蕉,是否有办法检测两个物体,而不是用相机试图找出在框架中可以找到哪 ...

8 使用openCV检测多个对象

我正在尝试开发一种识别两种不同模式的代码。 我已经分别训练了两个模式,并获得了两者的级联XML。 我将模式放在一个图像中,程序应该检测到它。 如何在openCV中使用'detectMultiScale'来实现它,还是有其他选项? 请帮忙 :) PS:我在openCV中使用C ...

9 如何删除R中多个数据框中的某些列?

可以说我有许多数据框,它们具有几乎相似的列的不同名称。 如何使用循环(或任何其他方式)操纵单个数据帧的列? 例如,我想一次删除所有数据帧的第一列。 ...

10 如何在不合并r中的数据帧的情况下从多个数据帧的列名中删除“-”和空格

我有 30 个数据帧说:data_01、data_02、....、data_30。 我试图从列名中删除空格和“-”,并使用以下代码将它们变成小写: 我必须为 30 个数据帧重复这个过程 30 次。 有什么方法可以用一个代码对所有数据帧执行此过程,而无需合并数据帧。 我试过这个:制作数据框列表 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM