Als voorbereiding voor een school opdracht probeer ik Python+openCV onder de knie te krijgen.
Wat ik nu probeer:
-Van een foto met gekleurde plastic bekers het aantal bekers te tellen.
-Van elk van deze bekers een gemiddelde kleur bepalen.
-De kleur tekenen als cirkel om de beker heen.
De code draait en geeft geen errors. Maar helaas klopt de uitvoer niet.
De kleur van de cirkel klopt niet met de kleur van de beker.
Om uit te zoeken waar het mis gaat bepaal ik van 1 beker de gemiddelde kleur nog een keer. Gek genoeg komt hier een andere kleur uit..
Inmiddels is dit opgelost met dank aan Kyumia
Welke held kan mijn denk of code fout ontdekken?
Als er nog aanvullende informatie nodig is hoor ik het graag!
(De rede dat er een wat rare onnodige while loop inzit is omdat dit programma uiteindelijk met een webcam moet gaan functioneren)
Wat ik nu probeer:
-Van een foto met gekleurde plastic bekers het aantal bekers te tellen.
-Van elk van deze bekers een gemiddelde kleur bepalen.
-De kleur tekenen als cirkel om de beker heen.
De code draait en geeft geen errors. Maar helaas klopt de uitvoer niet.
De kleur van de cirkel klopt niet met de kleur van de beker.
Om uit te zoeken waar het mis gaat bepaal ik van 1 beker de gemiddelde kleur nog een keer. Gek genoeg komt hier een andere kleur uit..

Welke held kan mijn denk of code fout ontdekken?
Als er nog aanvullende informatie nodig is hoor ik het graag!
Python: Kleurdetectie
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
| import cv2 import time import numpy as np cv2.namedWindow("Kleur",cv2.WINDOW_AUTOSIZE) cv2.namedWindow("Edges",cv2.WINDOW_AUTOSIZE) cv2.moveWindow("Kleur",00,00) cv2.moveWindow("Edges",1280,00) low_treshold = 100 high_treshold = 130 dp = 2 minDist = 30 param1 = 150 param2 = 45 minRadius = 70 maxRadius = 100 kleurradius = 15 # retval, img = webcam.read() while(True): img = cv2.imread('C:/Users/####/Desktop/Vision_Photos/image1_small.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_edges = cv2.Canny(img_gray, low_treshold, high_treshold) circles = cv2.HoughCircles(img_edges,cv2.HOUGH_GRADIENT, dp, minDist, None, param1, param2, minRadius, maxRadius) try: n = np.shape(circles) circles = np.reshape(circles,(n[1],n[2])) i=0 colors = np.zeros((len(circles), 3), dtype=np.uint32) while (i<len(circles)): temp0=[] temp1=[] temp2=[] #print(temp0," - ", temp1," - ", temp0) j=0 k=0 while (j<2*kleurradius): while(k<2*kleurradius): temp0.append(img[(circles[i][0]-kleurradius+j)][(circles[i][1]-kleurradius+k)][0]) temp1.append(img[(circles[i][0]-kleurradius+j)][(circles[i][1]-kleurradius+k)][1]) temp2.append(img[(circles[i][0]-kleurradius+j)][(circles[i][1]-kleurradius+k)][2]) k+=1 k=0 j+=1 colors[i][0]=np.sum(temp0)/len(temp0) colors[i][1]=np.sum(temp1)/len(temp1) colors[i][2]=np.sum(temp2)/len(temp2) i+=1 i=0 while(i<len(circles)): cv2.circle(img,(circles[i][0],circles[i][1]),circles[i][2],(int(colors[i][0]),int(colors[i][1]),int(colors[i][2])),2) i+=1 ##Vanaf hier bepaal ik de kleur nogmaals## t=0 temp0=[] temp1=[] temp2=[] #print(temp0," - ", temp1," - ", temp0) j=0 k=0 while (j<2*kleurradius): while(k<2*kleurradius): temp0.append(img[(circles[t][0]-kleurradius+j)][(circles[t][1]-kleurradius+k)][0]) temp1.append(img[(circles[t][0]-kleurradius+j)][(circles[t][1]-kleurradius+k)][1]) temp2.append(img[(circles[t][0]-kleurradius+j)][(circles[t][1]-kleurradius+k)][2]) k+=1 k=0 j+=1 cv2.circle(img,(circles[t][0],circles[t][1]),kleurradius,(0,0,0),2) cv2.circle(img,(circles[t][0],circles[t][1]),2*kleurradius,(int(np.sum(temp0)/len(temp0)),int(np.sum(temp0)/len(temp0)),int(np.sum(temp0)/len(temp0))),2) except: print("no circles found") cv2.imshow("Kleur",img) cv2.imshow("Edges",img_edges) break while(True): if(cv2.waitKey(10) == 27): print("Er zijn", len(circles), "cirkels gededecteerd") break cv2.destroyAllWindows() |
(De rede dat er een wat rare onnodige while loop inzit is omdat dit programma uiteindelijk met een webcam moet gaan functioneren)