Bonjour a tous ;
Je viens ici pour vous demander de l'aide , j'ai vraiment essayer beaucoup de " solution possible " , je suis a court d'idée et sa comment a faire
trop de temps que je "cale" sur une seule "fonction" ou "module" , j'en peux plus .
Desolez si la question a deja été posée .
mon but est :
Capturer une partie de l'écran avec mss ,
Faire un cv2.matchTemplate dessus ,
puis ensuite calculer la distance la plus courte a partir d'un point
ce premier scripte fonctionne tres bien mais ne fait pas de screenshot
quand j'essaie de simplement ajouté mss dans le jeux cela ne fonctionne plus , les images montrée par imshow sont toutes noir ....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 import cv2 import numpy as np from scipy.spatial.distance import cdist img = cv2.imread('C:\\Users\\Faon\\Documents\\P1\\SalleFm.png') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) template = cv2.imread('C:\\Users\\Faon\\Documents\\P1\\template.PNG',0) w, h = template.shape[::-1] res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) threshold = 0.75 loc = np.where( res >= threshold) #print("res = ",res) #print("loc = ",loc) #Counts the number of found matches, which are currently overlapping number = np.sum(res >= threshold) coordsFinded = list() count = 0 mask = np.zeros(img.shape[:2], np.uint8) #print("mask :",mask) for pt in zip(*loc[::-1]): if mask[pt[1] + h//2, pt[0] + w//2] != 255: mask[pt[1]:pt[1]+h, pt[0]:pt[0]+w] = 255 count += 1 cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3) rectCoord = (pt[0] + w , pt[1] + h ) #print(pt) #print("rectCoord", rectCoord) coordsFinded.append(pt) cv2.imshow('Matches',img) cv2.waitKey(0) & 0xFF== ord('q') #MODIF , a = le point de referrence pour calculé les distance a = np.array([[1036, 746]]) others = np.array(coordsFinded) def closest_point(pt, others): distances = cdist(pt, others) #print (dist(a, others)) #return others[distances.argmin()] winnerClose = others[distances.argmin()] print("the closest point is : ",winnerClose) closest_point(a, others)
voila le code qui pose probleme , les retours de la consoles ne sont pas utiles car c'est " les images " qui ne se chargent pas ?
A l'aide svp , pourquoi cela ne fonctionne pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 import cv2 import numpy as np import mss import time import numpy as np from scipy.spatial.distance import cdist time.sleep(10) ################################################################################ def screen_template_closest () : with mss.mss() as sct: # Part of the screen to capture monitor = {"top": 1059, "left": 62, "width": 285, "height": 640} #Get raw pixels from the screen, save it to a Numpy array img = np.array(sct.grab(monitor)) print("image shape",img.shape) # Display the picture cv2.imshow("OpenCV/Numpy normal", img) # Display the picture in grayscale cv2.imshow('OpenCV/Numpy grayscale',cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)) img_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) template = cv2.imread('C:\\Users\\Faon\\projetadminEnv3\\test\\templates.PNG',0) w, h = template.shape[::-1] res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) threshold = 0.75 #Counts the number of found matches, which are currently overlapping loc = np.where( res >= threshold) coordsFinded = list() count = 0 mask = np.zeros(img.shape[:2], np.uint8) for pt in zip(*loc[::-1]): if mask[pt[1] + h//2, pt[0] + w//2] != 255: mask[pt[1]:pt[1]+h, pt[0]:pt[0]+w] = 255 count += 1 cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3) coordsFinded.append(pt) cv2.imshow('Matches',img) cv2.waitKey(0) & 0xFF== ord('q') #closest distance from pta pta = np.array([[1036, 746]]) others1 = np.array(coordsFinded) print("others (all coords of finded images ) ",others1) distances = cdist(pta, others1) winnerClose = others1[distances.argmin()] print("the closest point is : ",winnerClose) #### print(screen_template_closest())
Merci d'avances !
Partager