Ошибка типа изображения: OpenCV Python - PullRequest
0 голосов
/ 05 июля 2018

Я получаю ошибку типа изображения при запуске кода. Я знаю, что HoughLinesP требует изображения в оттенках серого, но когда я пытаюсь преобразовать исходное изображение в оттенки серого, я получаю следующую ошибку (1):

ошибка: (-215) глубина == 0 || глубина == 2 || глубина == 5 в функции cv :: cvtColor

Если я запускаю HoughLinesP без преобразования в оттенки серого, я получаю следующую ошибку (2):

ошибка: (-215) image.type () == (((0) & ((1 << 3) - 1)) + (((1) -1) << 3)) в функции cv :: HoughLinesProbabilistic </p>

Я не знаю, какое преобразование мне нужно, чтобы избавиться от ошибки

Это код, где происходят ошибки:

#extract largest component from image.
components, output, stats, centroids = cv2.connectedComponentsWithStats(threshold_img, connectivity=4)
sizes = stats[:, -1]

max_label = 1
max_size = sizes[1]
for i in range(2, components):
    if sizes[i] > max_size:
        max_label = i
        max_size = sizes[i]
biggestComponent = np.zeros(output.shape)
biggestComponent[output == max_label] = 255
biggestComponent = biggestComponent - cv2.erode(biggestComponent, np.ones((5,5), np.uint8))
dilated = cv2.dilate(biggestComponent, np.ones((3,3), dtype=np.uint8))

#-------------------------ERROR(1)----------------------------#
dilated = cv2.cvtColor(dilated, cv2.COLOR_BGR2GRAY)

#obtaining corners using houghlines
def find_intersection(line1, line2):
    # extract points
    x1, y1, x2, y2 = line1[0]
    x3, y3, x4, y4 = line2[0]
    # compute determinant
    Px = ((x1*y2 - y1*x2)*(x3-x4) - (x1-x2)*(x3*y4 - y3*x4))/  \
        ((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4))
    Py = ((x1*y2 - y1*x2)*(y3-y4) - (y1-y2)*(x3*y4 - y3*x4))/  \
        ((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4))
    return Px, Py

def segment_lines(lines, delta):
    h_lines = []
    v_lines = []
    for line in lines:
        for x1, y1, x2, y2 in line:
            if abs(x2-x1) < delta: # x-values are near; line is vertical
                v_lines.append(line)
            elif abs(y2-y1) < delta: # y-values are near; line is horizontal
                h_lines.append(line)
    return h_lines, v_lines

def cluster_points(points, nclusters):
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
    _, _, centers = cv2.kmeans(points, nclusters, None, criteria, 10, cv2.KMEANS_PP_CENTERS)
    return centers

#-------------------------ERROR(2)----------------------------#
# run the Hough transform
lines = cv2.HoughLinesP(dilated, rho=1, theta=np.pi/180, threshold=100, maxLineGap=20, minLineLength=50)

1 Ответ

0 голосов
/ 05 июля 2018

Требуется некоторое базовое понимание изображений и их свойств.

В OpenCV изображения в основном массивы. Прежде чем приступить к какому-либо преобразованию, убедитесь, что это возможно в первую очередь.

Как это сделать?

  1. Узнайте о его свойствах, таких как форма (2D или 3D). Проверьте форму, используя атрибут shape.
  2. Знайте о его типе данных (int или float)
  3. Чтобы преобразовать его в подходящий тип данных, используйте astype() и передайте тип данных, в котором вы хотите, чтобы ваш массив находился.

Возвращаясь к вашему вопросу! (Я действительно запустил весь ваш код, чтобы прийти к такому выводу)

Ошибка 1:

ошибка: (-215) глубина == 0 || глубина == 2 || глубина == 5 в функции cv :: cvtColor

Эта ошибка возникает, когда передаваемое изображение имеет неправильную форму. В строке, которая вызывает эту ошибку, cv2.COLOR_BGR2GRAY ожидает, что изображение будет трехмерным массивом, но когда вы проверяете его, используя dilated.shape, он возвращает кортеж из двух значений, примерно такой, как этот (558L, 796L), который не является трехмерным массивом. Вы передаете 2D-массив, где функция ожидает 3D-массив. Результатом cv2.COLOR_BGR2GRAY является двумерный массив.

Ошибка 2:

ошибка: (-215) image.type () == (((0) & ((1 << 3) - 1)) + (((1) -1) << 3)) в функции cv :: HoughLinesProbabilistic </p>

Эта ошибка возникает из-за типа данных массива. Форма правильная, но ожидается массив типа int. dilated - это двумерный массив типа float.

Так как ты это изменишь? Измените тип данных массива, используя astype:

lines = cv2.HoughLinesP(dilated.astype(np.uint8), rho=1, theta=np.pi/180, threshold=100, maxLineGap=20, minLineLength=50)
...