ошибка self.attribute при переходе от функции к классу

#python #numpy #methods #numpy-ndarray #self

#питон #тупой #методы #numpy-ndarray #self

Вопрос:

Новичок в python и программировании в целом.. Не уверен, почему код выдает эту ошибку:

Файл «c:Users …Проекты PythonИспытания Пробная версия 4findClickPositions.py «, строка 18, в findclickpositions
AttributeError: объект ‘numpy.ndarray’ не имеет атрибута ‘needle_img_path’

Строка 18 , являющаяся:

self.needle_img_path = str(«./Деревья/» str(Дерево) «.png»)

Вот полный код:

 import cv2 as cv
import numpy as np
import os
from random import randint
from windowcapture import Windowcapture
from time import time

class find_object:

    def __init__(self):
        
        self.whatami = []
        self.needle_img_path = str("")

    def findclickpositions(self, img, Tree='tree', threshold=0.95, debug_mode=None):

        os.makedirs('Trees', exist_ok=True)
        self.needle_img_path = str("./Trees/"   str(Tree)   ".png")
        self.treeimage = cv.imread(self.needle_img_path, cv.IMREAD_REDUCED_COLOR_2)
        if not self.treeimage:
            raise Exception('Image file of requested tree not found')

        self.needle_img = cv.imread(self.needle_img_path, cv.IMREAD_REDUCED_COLOR_2)

        self.method = cv.TM_CCOEFF_NORMED
        self.result = cv.matchTemplate(self.img, self.needle_img, self.method)

        #cv.imshow('Result', result)
        #cv.waitKey()

        self.min_val, self.max_val, self.min_loc, self.max_loc = cv.minMaxLoc(self.result) #gets the best match position

        #print('Best match top left postion: %s' % str(max_loc))
        #print('Best match confidence: %s' % str(max_val))

        self.locations = np.where(self.result >=self.threshold)
        self.locations = list(zip(*self.locations[::-1]))

        #print(locations)

        self.needle_w = self.needle_img.shape[1]
        self.needle_h = self.needle_img.shape[0]

        self.rectangles = []
        for self.loc in self.locations:
            self.rect = [int(loc[0]), int(self.loc[1]), self.needle_w, self.needle_h]
            self.rectangles.append(self.rect)
            self.rectangles.append(self.rect)

        self.rectangles, self.weights = cv.groupRectangles(self.rectangles, 1, 0.5)

        #print(rectangles)

        if len(self.rectangles):
            #print('Matches found')

            line_colour = (0, 0, 255)
            line_type = cv.LINE_4

            self.marker_colour = (255, 0, 255)
            self.marker_type = cv.MARKER_CROSS

            for (x, y, w, h) in rectangles:

                self.top_left = (x, y)
                self.bottom_right = (x   w, y   h)      #finding bottom right corner to draw the rectangle

                cv.rectangle(self.screenshot_img, self.top_left, self.bottom_right, self.line_colour, 1, self.line_type)

                self.centre_x = x   int(w/2)
                self.centre_y = y   int(h/2)
                
                self.points = []
                self.points.append((centre_x, centre_y))

                cv.drawMarker(self.screenshot_img, (self.centre_x, self.centre_y), self.marker_colour, self.marker_type)

            #cv.imshow('Results', self.screenshot_img)
            #cv.waitKey()
        else:
            print('No good match found')

        return self.screenshot_img
 

Я запускаю его из основного и передаю методу изображение для ‘img’ и ‘tree’ для ‘tree’. Я даже не знаю, где numpy входит в эту часть кода, где говорится об ошибке. Я пробовал инициализировать его как строку (как вы можете видеть в этом коде), но это ничего не изменило. Даже когда я комментирую это в этой строке, я получаю то же самое в следующей строке; когда я ввожу адрес, проблема появляется в ‘self.treeimage’.

Комментарии:

1. можете ли вы поместить print(self.needle_img_path) непосредственно перед строкой исключения?

2. Покажите нам основную функцию, которая вызывает этот класс.

3. Также может помочь полная трассировка. Каким- self то образом аргумент в этой функции является массивом numpy, а не экземпляром find_object . Это заставляет нас подозревать, что вы неправильно вызвали этот метод.