#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
. Это заставляет нас подозревать, что вы неправильно вызвали этот метод.