【问题标题】:How to change bounding rect values of contour in OpenCV Python?如何在 OpenCV Python 中更改轮廓的边界矩形值?
【发布时间】:2018-03-13 16:57:27
【问题描述】:

我想改变下一个轮廓的宽度值。我试图这样做,但事实证明它仍然保留了轮廓的原始值。我该怎么做呢?提前谢谢你。

更新:这是我正在处理的实际代码。

temp = 0; #Holds the last element we iterated replaced value
for i,c in enumerate(contours2):
    [x, y, w, h] = cv2.boundingRect(contours2[i])

    if i in percentiles: #if the current index is in the percentiles array
        [i, j, k, l] = cv2.boundingRect(contours2[temp]) #Get contour values of element to overwrite
        k = (x+w)-i 
        temp=i+1;   
#DRAW
for c in contours2: #when I draw it the k value of the overwritten elements doesn't change,why?
    [x, y, w, h] = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

【问题讨论】:

  • 你能更明确地说明你想做什么吗?您的代码目前对我没有意义。每个循环的值都会被重写。

标签: python opencv opencv-contour


【解决方案1】:

这里有一个误解,纯粹是 Python 与 OpenCV 无关。检查以下代码:

>>> a = 5
>>> b = a
>>> a = 7
>>> a
7
>>> b
5

当我设置b = a 时,我将b 设置为与a 具有相同的当前值,但我实际上并没有创建一个新的名称 em> 为a。这意味着以后如果我更改a 的值,它不会影响b 的值。这是相关的,因为在您的代码中,您正在编写:

[i, j, k, l] = cv2.boundingRect(contours2[temp])
k = (x+w)-i 

好像这会修改轮廓。它没有;它只是修改变量k。而且您只是在循环的每次迭代中覆盖k

此外,边界框与轮廓不同。轮廓根本没有改变,因为您没有修改 contours2 变量。您需要知道您是否真的想要边界框或轮廓。轮廓是勾勒轮廓形状的点列表。边界框就是这样,适合您的轮廓点的最小尺寸垂直/水平框。如果要获取边界框并对其进行修改,则应将边界框存储到变量中;特别是,如果您要存储多个边界框,则需要将它们存储到一个列表中。例如:

bounding_boxes = []
for c in contours2:
    [x, y, w, h] = cv2.boundingRect(c)
    bounding_boxes.append([x, y, w, h])

这将为您提供一个列表,其中ith 元素是ith 轮廓周围的边界框。如果您想修改存储的边界框,只需在将其附加到列表之前执行此操作即可:

bounding_boxes = []
for c in contours2:
    [x, y, w, h] = cv2.boundingRect(c)
    w = w*2
    bounding_boxes.append([x, y, w, h])

您的代码应该做什么对我来说并不完全清楚,所以我不能给您一个固定的版本,但希望这会让您朝着正确的方向前进。

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2021-09-06
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多