首页 > 解决方案 > 为什么 OpenCV 会创建奇怪的矩形?

问题描述

我正在制作一个软件来跟踪视频范围内不同气泡区域的变化。我正在尝试使用 OpenCV 多跟踪器来跟踪这些由霍夫圆变换创建的圆。我的理解是,我需要定义一个边界框来传递给这个多跟踪器工具。所以我用基本的几何形状制作了盒子,但是当我通过下面的代码显示盒子时它给出了一个奇怪的结果:

import cv2
import numpy as np
import matplotlib.pyplot as plt

vidObj = cv2.VideoCapture('Data/video.mp4')

success = True
tracked = False
multiTracker = cv2.MultiTracker_create()

def Find_Circles(img):
    # Convert to gray-scale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # Blur the image to reduce noise
    img_blur = cv2.bilateralFilter(gray, 7, 50, 50)
    # Apply hough transform on the image
    circles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1, 70, param1=110, param2=10, minRadius=20, maxRadius=100)
    
    return circles

def Draw_Circles(img,circles,tracked):
    if circles is not None:
        circles = np.uint16(np.around(circles))
        
        if tracked is False:
            for i in circles[0, :]:
                
                cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0),2)
                cv2.rectangle(img, (i[0]-i[2], i[1]-i[2]), (i[0]+i[2], i[1]+i[2]), (0, 255, 0),2)
                
        else:
            (success, circles) = multiTracker.update(img)
            print(circles)            
    
while success:
    
    success, img = vidObj.read()
    
    if img is not None:
        Draw_Circles(img, Find_Circles(img),tracked)
        tracked = True
        
        imgplot = plt.imshow(img,cmap='gray')
        plt.show()

    else:
        success = False

这是结果。任何想法为什么?如果需要,可以提供 mp4 格式的视频。

标签: pythonopencv

解决方案


此行导致错误:

circles = np.uint16(np.around(circles))

“圆圈”中的值可以为负数,因此不能使用 uint16(无符号整数)类型。使用 int16:

circles = np.int16(np.around(circles))

推荐阅读