如何在OpenCV Python中更改轮廓的边界矩形值?

如何在OpenCV Python中更改轮廓的边界矩形值?,python,opencv,opencv-contour,Python,Opencv,Opencv Contour,我想更改下一个轮廓的宽度值。我试着这样做,但结果它仍然保留了轮廓的原始值。我该怎么做?先谢谢你 更新:这是我正在处理的实际代码 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

我想更改下一个轮廓的宽度值。我试着这样做,但结果它仍然保留了轮廓的原始值。我该怎么做?先谢谢你

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

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无关。检查以下代码:

>>> a = 5
>>> b = a
>>> a = 7
>>> a
7
>>> b
5
当我设置
b=a
时,我将
b
设置为与
a
具有相同的当前值,但实际上我并没有为
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])
这将为您提供一个列表,其中
i
th元素是
i
th轮廓周围的边界框。如果要修改存储的边界框,只需在将其附加到列表之前进行修改:

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

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

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

>>> a = 5
>>> b = a
>>> a = 7
>>> a
7
>>> b
5
当我设置
b=a
时,我将
b
设置为与
a
具有相同的当前值,但实际上我并没有为
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])
这将为您提供一个列表,其中
i
th元素是
i
th轮廓周围的边界框。如果要修改存储的边界框,只需在将其附加到列表之前进行修改:

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

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

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