Last answered:

09 Mar 2023

Posted on:

08 Jul 2022

0

The same code gives me different coin values

Good evening. I have tried to put the same .py file and the image from the resources in the same folder, but when I run the code it opens an image with different values for the coins, with sum=16p. How is it possible? I leave below the image it returns. Thank you
image.png

6 answers ( 0 marked as helpful)
Instructor
Posted on:

11 Jul 2022

0

Hey Alessandro,

Thank you for your question!

It seems like your code returns the same coin for very different radii and very different brightness values. Would you please make sure that your if-statements look exactly as follows:

values = []
for a, b in zip(bright_values, radii):
    if a > 150 and b > 110:
        values.append(10)
    elif a > 150 and b <= 110:
        values.append(5)
    elif a < 150 and b > 110:
        values.append(2)
    elif a < 150 and b < 110:
        values.append(1)

Could you also tell me the brightness values you are getting. Mine are as follows (the same as the ones Giles obtains):

[185.45375, 180.9975, 100.78625, 75.79375, 75.544375, 95.278125, 126.86625, 87.255]

Kind regards,
365 Hristina

Posted on:

11 Jul 2022

0

Good morning. Yes, the code is the same, in fact I've downloaded it from the resources. But the brightness values are different: [179.844375, 85.68625, 97.176875, 131.384375, 73.96875, 101.205625, 75.08125, 181.275625]

Instructor
Posted on:

13 Jul 2022

0

Hey Alessandro,

Thank you for your answer!

Unfortunately, I can't think of a reason why your brightness values are different compared to the ones in the lecture. As a final check, could you copy-paste the entire code for me to test it? Please, do this using the codeBlock option below, so that the formatting is correct.
image.png

Thank you!

Kind regards,
365 Hristina

Posted on:

13 Jul 2022

0

I leave the code below. Futhermore, now I have 2 new errors: "import numpy could not be resolved" and "import cv2 could not be resolved", and I don't know why. Thank you.

import numpy as np
import cv2
#per commentare in blocco bisogna fare Ctrl+K+C e per decommentare Ctrl+K+U
# img=cv2.imread('capstone_coins.png',cv2.IMREAD_GRAYSCALE) #in questa variabile salva il file in questione in bianco e nero direi
# original_image=cv2.imread('capstone_coins.png',1) #non so cosa significhi l'1, ma in questa variabile salva il file originale; ho notato anche che l'1 serve ad avere l'immagine a colori, mentre con lo 0 diventa in bianco e nero
# img=cv2.GaussianBlur(img,(5,5),0) #non so come funzioni questo metodo, ma blurriamo l'immagine perchè altrimenti nel trovare i cerchi disegnerebbe cerchi ovunque, cioè ne troverebbe ovunque se le monete sono troppo dettagliate
# cv2.imshow('Detected Coins',original_image) #questo fa comparire l'immagine detta nel secondo argomento
# cv2.waitKey(0) #questo serve solo a mostrare l'immagine fintanto che non premiamo un tasto sulla tastiera
# cv2.destroyAllWindows()

#questa function restituisce l'elenco delle luminosità medie interne a ogni cerchio identificato
def av_pix(img,circles,size):
    av_value=[]
    for coords in circles[0,:]:
        col=np.mean(img[coords[1]-size:coords[1]+size,coords[0]-size:coords[0]+size]) #np.mean() sarebbe numpy.mean(), cioè la funzione che fa la media della luminosità, e viene fatta su un quadrato che si estende lungo x da un punto a un punto (x1:x2) e lungo y da un altro punto a un altro punto (y1:y2) (secondo me 1 e 0 sono invertiti qui, boh)
        # print(img[coords[1]-size:coords[1]+size,coords[0]-size:coords[0]+size])
        av_value.append(col)
    return av_value



#questa function restituisce la lista dei raggi dei cerchi identificati
def get_radius(circles):
    radius=[]
    for coords in circles[0,:]:
        radius.append(coords[2])
    return radius



img=cv2.imread('capstone_coins.png',cv2.IMREAD_GRAYSCALE) #in questa variabile salva il file in questione in bianco e nero
original_image=cv2.imread('capstone_coins.png',1#non so cosa significhi l'1, ma in questa variabile salva il file originale; ho notato anche che l'1 serve ad avere l'immagine a colori, mentre con lo 0 diventa in bianco e nero
img=cv2.GaussianBlur(img,(5,5),0#non so come funzioni questo metodo, ma blurriamo l'immagine perchè altrimenti nel trovare i cerchi disegnerebbe cerchi ovunque, cioè ne troverebbe ovunque se le monete sono troppo dettagliate
circles=cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,0.9,120,param1=50,param2=27,minRadius=60,maxRadius=120)



print(circles#così possiamo vedere nel terminale i cerchi trovati (sono 8: i primi due numeri sono le coordinate e il terzo numero è il raggio)

circles=np.uint16(np.around(circles)) #questa riga serve ad approssimare a un intero i numeri mostrati nel terminale quando stampiamo i circles e vogliamo farlo perchè non abbiamo frazioni di pixel nell'immagine (non mi è chiaro in che senso non abbiamo frazioni di pixel, a me sembra di sì, ma vabbè)
count=1
for i in circles[0,:]:
    #Disegna il cerchio più esterno
    cv2.circle(original_image,(i[0],i[1]),i[2],(0,255,0),2#questo disegna il cerchio; in particolare in input ci sono le coordinate del centro (i[0] e i[1]), il raggio (i[2]), il colore ((0,255,0)) e lo spessore della linea che disegna (2)
    #Disegna il centro del cerchio
    cv2.circle(original_image,(i[0],i[1]),2,(0,0,255),3)
    # cv2.putText(original_image,str(count),(i[0],i[1]),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,0),2) #questo scrive il numero del cerchio trovato (str(count)) all'interno dei cerchi disegnati, che hanno centro (i[0],i[1]), il font è cv2.FONT_HERSHEY_SIMPLEX, la scala del font è 2, il colore è nero e lo spessore è 2
    count+=1

radii=get_radius(circles)
print(radii)
bright_values=av_pix(img,circles,20#deduco che mette 40 come dimensione perchè è sia sufficientemente grande a livello di campionamento statistico, sia minore di tutti i raggi dei cerchi, così il quadrato che fa le medie è sempre completamente all'interno di ogni cerchio
print(bright_values#la luminosità è un numero che va da 0 a 255

values=[]
for a,b in zip(bright_values,radii):
    if a>150 and b>110:
        values.append(10)
    elif a>150 and b<=110:
        values.append(5)
    elif a<=150 and b>110#io metto minore o uguale perchè è più corretto, l'insegnante aveva messo solo minore
        values.append(2)
    elif a<=150 and b<=110:
        values.append(1)
print(values)
count2=0
for i in circles[0,:]:
    cv2.putText(original_image,str(values[count2]) + 'p',(i[0],i[1]),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,0),2)
    count2+=1
cv2.putText(original_image,'Total is'+str(sum(values))+'p',(200,100),cv2.FONT_HERSHEY_SIMPLEX,1.3,255#non so perchè metta un parametro in meno, e non sapevo neanche che si potesse mettere 255 direttamente senza le parentesi con i 3 valori, ma credo

cv2.imshow('Detected Coins',original_image#questo fa comparire l'immagine detta nel secondo argomento
cv2.waitKey(0#questo serve solo a mostrare l'immagine fintanto che non premiamo un tasto sulla tastiera
cv2.destroyAllWindows()


Posted on:

13 Dec 2022

1

Hi Alessandro,
I also encountered with same issue. The total coin values are 16p and I got same brightness values as yours.
But I dont know why it happens

Posted on:

09 Mar 2023

1

Decreases the radii that solves the problem:

values = []
for a,b in zip(bright_values,radii):
    if a > 150 and b > 90:
        values.append(10)
    elif a > 150 and b <= 90:
        values.append(5)
    elif a < 150 and b > 90:
        values.append(2)
    elif a < 150 and b < 90:
        values.append(1)        
print(values)  

Submit an answer