ValueError:当数组不是序列时,使用序列设置数组元素

时间:2014-01-15 09:13:36

标签: python opencv numpy

您好此代码用于存储使用open cv绘制的矩形坐标,并将结果编译为单个图像。

import numpy as np
import cv2

im = cv2.imread('1.jpg')
im3 = im.copy()

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)



contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)


squares = []

for cnt in contours:
    if cv2.contourArea(cnt)>50:
        [x,y,w,h] = cv2.boundingRect(cnt)

        if  h>28 and h<34:
            rect = (cv2.rectangle(im,(x,y),(x+w,y+h),(255,255,255),3))
            squares.append(cv2.boundingRect(cnt))
            cv2.imwrite('norm1.jpg',im)

crop_img = [[255 for x in xrange(377)] for x in xrange(377) ]

for s in squares:
    s = squares[0]
    x = s[0]
    y = s[1]
    w = s[2]
    h = s[3]
    img = im[y:y+h,x:x+w]
    for col in range(y,y+h):
        for row in range(x,x+w):
            if img[col - y][row - x].tolist() == [0,0,0]:
                crop_img[col][row] = [0,0,0]



cv2.imwrite("cropped.jpg", np.array(crop_img))

但是,它会抛出此错误消息

File "C:\Users\Program\Desktop\new  1.py", line 43, in <module>
    cv2.imwrite("cropped.jpg", np.array(crop_img))
ValueError: setting an array element with a sequence

我已经读过这可能是由于“不均匀”的矩阵引起的,但经过几轮测试后我确认它确实是一个正方形 377 x 377矩阵

供参考:“1.jpg”是下图所示的图像

1

非常感谢任何关于如何解决此错误的线索!

2 个答案:

答案 0 :(得分:2)

                crop_img[col][row] = [0,0,0]

这应该是RGB值吗? crop_img以377个元素的列表开头,每个元素都是377个元素的列表,每个元素的元素是整数255。此行用列表替换255。目前尚不清楚你是否想要二维嵌套,这是你初始化crop_img或三维嵌套的方式,这就是这条线所暗示的。选择适合您应用的那个并坚持下去。

答案 1 :(得分:2)

这里的每个“像素”都有一个值。 crop_img = [[255 for x in xrange(377)] for x in xrange(377) ]

但后来你将其中一些设置为3个值的列表。那就是问题 这应该解决它我认为:
crop_img = [[[255, 255, 255] for x in xrange(377)] for x in xrange(377) ]

虽然你可能会从一个形状为377,377,3的numpy数组开始,而不是之后转换它。