Python: переменные, похоже, не переназначаются, пока l oop + локальная переменная, на которую ссылаются перед присваиванием - PullRequest
1 голос
/ 27 марта 2020

, поэтому я работал над небольшим проектом, чтобы улучшить свои навыки с OpenCV в Python. Но почему-то я борюсь со своими переменными в функции.

Это мой основной код с l oop. В основном я хочу, чтобы он запускал функцию 3 раза, которая указана в другом файле и обрезает заданное изображение.

croppedImage = [0] * len(urls)
while number < 3:
    message, croppedImage[number] = ImageProcessing.cropImage(path)
    print(bot+"Successfully cropped "+message)
    number += 1

Моя функция выглядит следующим образом. Мне как-то пришлось назначить координаты для обрезки данного изображения в качестве глобальных переменных, поскольку я получил другую ошибку без этого ( "локальная переменная, на которую ссылаются перед присваиванием" ). Но с помощью этого кода я, по крайней мере, могу успешно обрезать первое изображение на основе его цветов.

import cv2
import numpy as np

def cropImage(path):
    global x_coordinate
    global y_coordinate
    global image_width
    global image_height
    img = cv2.imread(path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower_range = np.array([70, 14, 35])
    upper_range = np.array([125, 55, 36])
    mask = cv2.inRange(hsv, lower_range, upper_range)
    contours = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    contours = contours[0] if len(contours) == 2 else contours[1]
    result = img.copy()
    largest_area = 0
    for contour in contours:
        (x, y, w, h) = cv2.boundingRect(contour)
        if w > 650 and w < 750:
            area = cv2.contourArea(contour)
            if area > largest_area:
                largest_area = area
                (x_coordinate, y_coordinate, image_width, image_height) = (x, y, w, h)

    croppedImage = result[y_coordinate:y_coordinate+image_height, x_coordinate:x_coordinate+image_width]
    message = "[Width: "+str(image_width)+"] [Height: "+str(image_height)+"]"
    return message, croppedImage

В основном код должен обрезать заданные изображения, но каким-то образом он работает только на первом изображении. После того, как переменные X, Y, Width и Height были назначены в первом запуске, код не обновляет эти переменные во втором запуске, пока l oop. Таким образом, каждое изображение обрезается до одного и того же размера, но я скорее хочу, чтобы изображение было обрезано до определенного размера (переменная image_width , а также переменная image_height остается неизменной ).

Я пытался решить эту проблему с незапамятных времен, но у меня не получается. Благодарим вас за помощь, заранее.


РЕДАКТИРОВАТЬ: Иногда это даже не работает, и я получаю только сообщение об ошибке «NameError: name 'y_coordinate' is notfined».

1 Ответ

0 голосов
/ 27 марта 2020

Возможно, проблема в размещении назначения в последней строке этого блока:

   for contour in contours:
        (x, y, w, h) = cv2.boundingRect(contour)
        if w > 650 and w < 750:
            area = cv2.contourArea(contour)
            if area > largest_area:
                largest_area = area
                (x_coordinate, y_coordinate, image_width, image_height) = (x, y, w, h)

, которое не обязательно выполняется.

Одним из решений может быть:

(x_coordinate, y_coordinate, image_width, image_height) = cv2.boundingRect(contours[0])
for contour in contours[1:]:
            (x, y, w, h) = cv2.boundingRect(contour)
            if w > 650 and w < 750:
                area = cv2.contourArea(contour)
                if area > largest_area:
                    largest_area = area
                    (x_coordinate, y_coordinate, image_width, image_height) = (x, y, w, h)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...