【问题标题】:Finding the Biggest Rectangle with OpenCV detectMultiScale使用 OpenCV detectMultiScale 找到最大的矩形
【发布时间】:2019-12-26 16:42:51
【问题描述】:

我正在从事一个关于鸟类的项目,该项目需要我检测杂草。我在下面编写了程序code2,它可以工作。但是,我需要在图像上显示最大的矩形。我尝试使用 code1,但是,当我在 code2 中使用这段代码时,它会给出错误:

“第 21 行 for (x, y, w, h) in最大:TypeError: cannot unpack non-iterable numpy.int32 object”。

我不知道如何解决它。请帮助我,谢谢!

代码1

areas = [w*h for x,y,w,h in birds]
a_biggest = np.argmax(areas)
biggest = birds[a_biggest]

代码2

import cv2
import numpy as np

bird_cascade = cv2.CascadeClassifier("birdcascadeHAAR.xml")
gray = cv2.imread("trialpic30.jpg", 0)
birds, rejectLevels, levelWeights = bird_cascade.detectMultiScale3(
    gray,
    scaleFactor=1.185,
    minNeighbors=20,
    outputRejectLevels = True
    )

print(rejectLevels)
print(levelWeights)

for (x,y,w,h) in birds:
    cv2.rectangle(gray, (x,y), (x+w, y+h), (255,0,0), 2)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(gray, str(levelWeights), (x+w-115, y+h-115), font, 0.5, (255, 0, 0), 1, cv2.LINE_AA)

cv2.imshow("img", gray)
cv2.waitKey()

【问题讨论】:

  • np.argmax() 返回数组中最大值的索引。我想你可能想要 np.amax()。见docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.htmldocs.scipy.org/doc/numpy/reference/generated/…
  • 我阅读了文档,看起来 np.amax 返回数组中的最大值,但是,我需要最大的总数组值,本质上是给我最大的矩形。不过谢谢!
  • 使用 print 检查您在 biggest 中的内容。如果您有一个列表中的元素,那么您可能需要在没有for-loop 的情况下解压缩它x, y, w, h = biggest。或将其转换为包含一个元素 [biggest] 的列表,然后与 for-loop 一起使用 - for x, y, w, h in [biggest]
  • 当我打印最大时,程序正确地将较大矩形的数组输出为 [922 551 322 322]

标签: python numpy opencv computer-vision artificial-intelligence


【解决方案1】:

使用

biggest = birds[a_biggest]

biggest = [922 551 322 322]

你从列表中得到一个元素,但你没有列表了,所以你应该直接解压它

x, y, w, h = biggest

x, y, w, h = [922 551 322 322]

最终你将不得不使用这个单个元素 [biggest] 创建列表以与循环一起使用

for x, y, w, h in [biggest]:

for x, y, w, h in [ [922 551 322 322] ]:

当您将单个元素与for-loop 一起使用时

for x, y, w, h in biggest:

那么你有类似的东西

for x, y, w, h in [922 551 322 322]:

所以它从列表[922 551 322 322](即922)中获取第一个元素,并尝试分配

x, y, w, h = 922

问题来了

【讨论】:

  • 我用你的代码修复了程序,效果很好。谢谢!
  • 我有一个问题。我目前打印所有检测的级别权重和拒绝级别,有没有办法仅打印显示的矩形的级别权重和拒绝级别?
  • print( rejectLevels[a_biggest], levelWeights[a_biggest] )
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 2014-06-07
  • 2013-07-04
  • 2021-09-01
  • 2018-09-01
  • 2016-01-24
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多