Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 错误:操作数无法与形状(1776,1,2)(3896,1,2)一起广播_Python_Python 2.7_Image Processing - Fatal编程技术网

Python 错误:操作数无法与形状(1776,1,2)(3896,1,2)一起广播

Python 错误:操作数无法与形状(1776,1,2)(3896,1,2)一起广播,python,python-2.7,image-processing,Python,Python 2.7,Image Processing,我是python新手,我正试图编写一段代码,从图像中提取轮廓,并按照轮廓列表中元素长度的升序对它们进行排序。当我使用sort()或list.sort()时,我得到一个错误:操作数不能与形状(1776,1,2)(3896,1,2)一起广播 我怎样才能解决这个问题? 这是我正在使用的 我收到的错误消息是: Traceback (most recent call last): File "/home/dehaoliu/opencv_test/Engineering drawings/example.

我是python新手,我正试图编写一段代码,从图像中提取轮廓,并按照轮廓列表中元素长度的升序对它们进行排序。当我使用sort()或list.sort()时,我得到一个错误:操作数不能与形状(1776,1,2)(3896,1,2)一起广播 我怎样才能解决这个问题? 这是我正在使用的

我收到的错误消息是:

Traceback (most recent call last):

File "/home/dehaoliu/opencv_test/Engineering drawings/example.py", line 19, in <module>
    contours.sort()
ValueError: operands could not be broadcast together with shapes (1776,1,2) (3896,1,2) 

请注意,您的原始问题和缩短版本都包含一些错误,这使得再现您的问题有点困难。此外,您似乎正在做很多不必要的事情(例如导入数学、图像、matplotlib、scipy等而不使用它们,或者保存图像只是为了用另一个名称再次读取它们)

无论如何,你问题的核心可以很容易地回答。从
cv2.findContours
返回的
轮廓
,如下所示:

>>> type(contours)
list
>>> len(contours)
15
>>> type(contours[0])
numpy.ndarray
>>> print(contours[0].shape)
(3888, 1, 2)
也就是说,您的15条轮廓中的每一条都是一个具有形状
(N,1,2)
的3d numpy阵列。撇开单体维度不谈,基本上矩阵中有
N*2
点:
N
对整数,即
N
x,y
图像坐标,跟踪图像上给定的轮廓

现在,当您尝试对这个数组列表进行排序时,python尝试比较两个元素,例如

contours[0] < contours[1]

让错误消失很容易,确保结果是您想要的结果就不那么容易了。你知道错误中的维度是什么吗?你的预期结果应该是多大?我相信它们是列表中第一个和第二个元素的维度。对不起,如果这是一个愚蠢的问题。我以前没有使用python的经验,现在我一直在努力解决这个问题。是的,但是他们的目的是什么?我的观点是,我可以告诉你如何使维度传播,结果可能是
(17763896,1,2)
,例如。但这是否有意义是另一回事,你应该了解发生了什么,你到底想做什么。非常感谢你告诉我这件事。谢谢非常感谢你!现在这很有道理。我想我之所以不能理解这个错误是因为我不熟悉python以及相应的代码行在做什么,但是谢谢你帮助我更好地理解它:)@Alizay我很高兴我能帮上忙。如果您有时间,如果您想使用构建在上面的框架,那么学习本地python本身会有很大帮助。不管怎样,如果上面确实解决了你的问题,请考虑。
contours[0] < contours[1]
>>> np.random.rand(2,3) < np.random.rand(1,3)
array([[ True,  True, False],
       [False,  True, False]], dtype=bool)
>>> np.random.rand(2,3) < np.random.rand(4,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (4,3) 
>>> [contour.shape[0] for contour in contours]
[3888, 1775, 1044, 1508, 255, 95, 233, 330, 310, 177, 155, 592, 506, 1044, 663]
>>> contours.sort(key=lambda contour: contour.shape[0])
>>> [contour.shape[0] for contour in contours]
[95, 155, 177, 233, 255, 310, 330, 506, 592, 663, 1044, 1044, 1508, 1775, 3888]