python - 为什么 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 格式的视频。
解决方案
此行导致错误:
circles = np.uint16(np.around(circles))
“圆圈”中的值可以为负数,因此不能使用 uint16(无符号整数)类型。使用 int16:
circles = np.int16(np.around(circles))
推荐阅读
- c++ - 如何在 gdb 中打印多态对象的 ptype
- python - 等待父标签是否可以确保使用 Selenium 完全加载子标签?
- python - Qiskit 投资组合优化应用程序
- ruby-on-rails - 如何将使用 Active Storage 上传的 pdf 转换为 rails 中的图像
- visual-studio-2019 - 解决方案资源管理器中项目图标上覆盖有感叹号的蓝色圆圈是什么意思?
- html - 在 IE 中创建自定义单选按钮
- c++ - 损坏的 `std::promise`s (当我在 `.get()` 处理它们之前存储许多期货时,为什么它们会损坏?)
- python - 熊猫列表理解以更改 df 中的整数
- ansible - Ansible:如何在变量未定义时传递条件
- linux - "./ 之间有什么区别?
“ 和 ”。./ “?