【问题标题】:detect object in image with almost similar background检测具有几乎相似背景的图像中的对象
【发布时间】:2020-05-04 06:41:06
【问题描述】:

我必须检测笼子里的老鼠,输入图像如下所示:

目前我在视频流中使用cv.createBackgroundSubtractorMOG2() 来查找包含老鼠的区域,然后使用 Canny Edge 检测器来提取老鼠的轮廓。 然而,这并没有那么好......老鼠移动得越多越好,但我想可能有更好的方法来检测老鼠。

有没有人对如何检测老鼠有不同的想法?

提前致谢

【问题讨论】:

    标签: opencv computer-vision object-detection


    【解决方案1】:

    减去背景后,您可以使用阈值来去除噪音。尝试保存减去的图像并查看它的外观。这是我用来调整滤镜参数的脚本(使用减去的图像运行它):

    import cv2
    import numpy as np
    
    screenshot_path = 'screenshot.bmp'
    
    def nothing(x):
        pass
    
    
    # Creating a window for later use
    cv2.namedWindow('mask', cv2.WINDOW_NORMAL)
    cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
    
    # Starting with 100's to prevent error while masking
    h, s, v = 100, 100, 100
    
    # Creating track bar
    
    cv2.createTrackbar('h', 'trackbar', 0, 180, nothing)
    cv2.createTrackbar('s', 'trackbar', 0, 255, nothing)
    cv2.createTrackbar('v', 'trackbar', 164, 255, nothing)
    cv2.createTrackbar('h2', 'trackbar', 120, 180, nothing)
    cv2.createTrackbar('s2', 'trackbar', 12, 255, nothing)
    cv2.createTrackbar('v2', 'trackbar', 253, 255, nothing)
    frame = cv2.imread(screenshot_path)
    
    # converting to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    while (1):
        # get info from track bar and appy to result
        h = cv2.getTrackbarPos('h', 'trackbar')
        s = cv2.getTrackbarPos('s', 'trackbar')
        v = cv2.getTrackbarPos('v', 'trackbar')
        h2 = cv2.getTrackbarPos('h2', 'trackbar')
        s2 = cv2.getTrackbarPos('s2', 'trackbar')
        v2 = cv2.getTrackbarPos('v2', 'trackbar')
    
        # Normal masking algorithm
        lower = np.array([h, s, v])
        upper = np.array([h2, s2, v2])
    
        mask = cv2.inRange(hsv, lower, upper)
    
        result = cv2.bitwise_and(frame,frame,mask = mask)
    
        cv2.imshow('result', result)
        print(h, s, v, h2, s2, v2)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break
    
    cv2.destroyAllWindows()
    

    如果这不起作用,我会使用像 CSRT 这样的对象跟踪器 API

    # python opencv_object_tracking.py
    # python opencv_object_tracking.py --video dashcam_boston.mp4 --tracker csrt
    
    # import the necessary packages
    from imutils.video import VideoStream
    from imutils.video import FPS
    import argparse
    import imutils
    import time
    import cv2
    
    # construct the argument parser and parse the arguments
    ap = argparse.ArgumentParser()
    ap.add_argument("-v", "--video", type=str,
        help="path to input video file")
    ap.add_argument("-t", "--tracker", type=str, default="kcf",
        help="OpenCV object tracker type")
    args = vars(ap.parse_args())
    
    # extract the OpenCV version info
    (major, minor) = cv2.__version__.split(".")[:2]
    
    # if we are using OpenCV 3.2 OR BEFORE, we can use a special factory
    # function to create our object tracker
    if int(major) == 3 and int(minor) < 3:
        tracker = cv2.Tracker_create(args["tracker"].upper())
    
    # otherwise, for OpenCV 3.3 OR NEWER, we need to explicity call the
    # approrpiate object tracker constructor:
    else:
        # initialize a dictionary that maps strings to their corresponding
        # OpenCV object tracker implementations
        OPENCV_OBJECT_TRACKERS = {
            "csrt": cv2.TrackerCSRT_create,
            "kcf": cv2.TrackerKCF_create,
            "boosting": cv2.TrackerBoosting_create,
            "mil": cv2.TrackerMIL_create,
            "tld": cv2.TrackerTLD_create,
            "medianflow": cv2.TrackerMedianFlow_create,
            "mosse": cv2.TrackerMOSSE_create
        }
    
        # grab the appropriate object tracker using our dictionary of
        # OpenCV object tracker objects
        tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
    
    # initialize the bounding box coordinates of the object we are going
    # to track
    initBB = None
    
    # if a video path was not supplied, grab the reference to the web cam
    if not args.get("video", False):
        print("[INFO] starting video stream...")
        vs = VideoStream(src=0).start()
        time.sleep(1.0)
    
    # otherwise, grab a reference to the video file
    else:
        vs = cv2.VideoCapture(args["video"])
    
    # initialize the FPS throughput estimator
    fps = None
    
    # loop over frames from the video stream
    while True:
        # grab the current frame, then handle if we are using a
        # VideoStream or VideoCapture object
        frame = vs.read()
        frame = frame[1] if args.get("video", False) else frame
    
        # check to see if we have reached the end of the stream
        if frame is None:
            break
    
        # resize the frame (so we can process it faster) and grab the
        # frame dimensions
        frame = imutils.resize(frame, width=500)
        (H, W) = frame.shape[:2]
    
        # check to see if we are currently tracking an object
        if initBB is not None:
            # grab the new bounding box coordinates of the object
            (success, box) = tracker.update(frame)
    
            # check to see if the tracking was a success
            if success:
                (x, y, w, h) = [int(v) for v in box]
                cv2.rectangle(frame, (x, y), (x + w, y + h),
                    (0, 255, 0), 2)
    
            # update the FPS counter
            fps.update()
            fps.stop()
    
            # initialize the set of information we'll be displaying on
            # the frame
            info = [
                ("Tracker", args["tracker"]),
                ("Success", "Yes" if success else "No"),
                ("FPS", "{:.2f}".format(fps.fps())),
            ]
    
            # loop over the info tuples and draw them on our frame
            for (i, (k, v)) in enumerate(info):
                text = "{}: {}".format(k, v)
                cv2.putText(frame, text, (10, H - ((i * 20) + 20)),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
    
        # show the output frame
        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1) & 0xFF
    
        # if the 's' key is selected, we are going to "select" a bounding
        # box to track
        if key == ord("s"):
            # select the bounding box of the object we want to track (make
            # sure you press ENTER or SPACE after selecting the ROI)
            initBB = cv2.selectROI("Frame", frame, fromCenter=False,
                showCrosshair=True)
    
            # start OpenCV object tracker using the supplied bounding box
            # coordinates, then start the FPS throughput estimator as well
            tracker.init(frame, initBB)
            fps = FPS().start()
    
        # if the `q` key was pressed, break from the loop
        elif key == ord("q"):
            break
    
    # if we are using a webcam, release the pointer
    if not args.get("video", False):
        vs.stop()
    
    # otherwise, release the file pointer
    else:
        vs.release()
    
    # close all windows
    cv2.destroyAllWindows()
    

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2019-10-11
      • 1970-01-01
      • 2016-06-03
      • 2019-06-22
      • 2018-11-28
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多