Relatorio TP2
Relatorio TP2
Relatorio TP2
Trabalho Prático nº 2
Scikit-image e OpenCV
Índice
1. Introdução ............................................................................................................. 4
1.1. Requisitos e tutoriais .................................................................................... 5
1.1.1. OpenCV [1] .................................................................................................. 5
1.1.2. Scikit-image [2] ........................................................................................... 5
2. Métodos.................................................................................................................. 5
2.1. Understanding the basics of gray image processing ............................... 5
2.2. Understanding the basics of color image processing .............................. 7
2.3. Understanding the basics of image transformations .............................. 9
2.4. Scikit-image .................................................................................................. 10
2.5. OpenCV - Licence Plate ............................................................................. 12
2.6. OpenCV - Pokemons .................................................................................. 13
2.7. Menus............................................................................................................. 15
2.7.1. Menu Inicial ............................................................................................... 15
2.7.2. Menu Exercicio 1 ...................................................................................... 15
2.7.3. Menu Exercicio 2 ...................................................................................... 15
2.7.4. Menu Exercicio 3 ...................................................................................... 15
2.7.5. Menu Exercicio 4 ...................................................................................... 16
2.7.6. Menu Exercicio 5 ...................................................................................... 16
2.7.7. Menu Exercicio 6 ...................................................................................... 16
2.7.8. Menu Pokemons ....................................................................................... 16
3. Resultados............................................................................................................ 17
3.1. Understanding the basics of gray image processing.............................. 17
3.1.a. Show the algoritm .................................................................................... 17
3.1.b. Test the function color2gray(color)...................................................... 18
3.1.d. Test the function image2gray(file path) ............................................... 19
3.2. Understanding the basics of color image processing ............................ 20
3.2.a. Show the average RGB from image...................................................... 20
3.2.b. Get and update a pixel from the image ............................................... 21
3.2.c. Show the location of the pixel with higher values .............................. 22
3.3. Understanding the basics of image transformations ............................ 23
3.3.a. Rotate image 90 degrees clockwise ...................................................... 23
3.3.b. Rescale image to one quarter of its size .............................................. 23
3.4. Scikit-image .................................................................................................. 24
3.4.a. Change background to an color............................................................. 25
3.4.b. Resize or Rescale image .......................................................................... 25
3.4.b.1. Resize ...................................................................................................... 25
3.4.b.2. Rescale .................................................................................................... 26
3.4.c. Rotate the image ...................................................................................... 26
3.4.d. Flip the image ........................................................................................... 27
3.4.d.1. Horizontaly ............................................................................................ 27
3.4.d.2. Vertically................................................................................................. 28
3.4.e. Crop the image ......................................................................................... 28
3.5. OpenCV-Licence Plate ............................................................................... 29
3.6. OpenCV-Pokemon ...................................................................................... 29
3.6.a. Recognize pokemons in a static image ................................................. 30
3.6.a.1/4. Charmander,Pikachu,Bulbasaur,Squirtle ...................................... 30
3.6.a.5. All pokemons ......................................................................................... 31
1. Introdução
Como segundo trabalho pratico este consiste em desenvolver 6 mini programa que
implicam os novos metodos lecionados nas aulas.
O primeiro exercicio consiste na transformacao de cores RGB para uma escala de
cinzento correspondente a cor respetiva. A escala de cinzento pode ser obtida atraves da
formula fornecida no enunciado que diz o seguinte: escala de cinzento = 0.2126 * vermelho
+ 0.7152*verde+0.0722*azul, em que R,G,B corresponde a vermelho,verde,azul
respetivamente. Após se conseguir obter as escalas de cinzento das cores será nescessario
utilizar o mesmo metodo para desta vez passar uma imagem para preto e branco, isto tudo sem
utilizar as bibliotecas já existentes de processamento de imagens.
O segundo exercicio consiste em obter e alterar dados de determinadas imagens.Como
primeiro pedido é nescessario obter o “RGB medio” de uma imagem introduzida pelo utilizador.
De seguida é nescessario poder obter os valores de RGB de um determinado pixel introduzido
pelo utilizador e de seguida alterar os seus valores para novos valores introduzidos pelo
utilizador. Por deve-se conseguir encontrar e mostrar ao utilizador o pixel com os valores RGB
mais altos de uma imagem introduzida por ele.
O terceiro exercicio esta dividido em 2 sub-programas em que o primeiro consiste em
rodar uma imagem 90º em sentido horario. O segundo sub-programa consiste em dar “rescale”
a uma imagem para 1/4 do tamanho original. Ambos os programas devem ser realizados sem o
auxilio das bibliotecas Scikit-image e OpenCV.
No quarto deverá ser possivel efetuar varias alteracoes a uma imagem, desta vez ja se
pode recorrer as bibliotecas já existentes. Deve ser possivel mudar a cor do fundo de fundo
(imagem com fundo branco) para uma cor inserida pelo utilizador. Este exercicio terá varias
formas de alterar a imagem tais como:
• Alterar o tamanho da imagem
• Rodar a imagem
• Cortar a imagem
• Aplicar diversos filtros
• Inverter a imagem
Apos serem aplicadas as alteraçoes desejadas deve ser mostrada a imagem original e a imagem
alterada lado a lado, permitindo assim confirmar as mudanças.
No quinto exercicio é nescessario identificar uma matricula inserida pelo o utilizador e
extrair o numero da matricula. Apos se lero numero da matricula deve ser mostrada a matricula
devidamente selecionada e com o seu numero impresso por cima.
Por fim, o ultimo exercicio é sobre algo que animou a infancia a muitas crianças. Esse
algo são os Pokemons. Sendo assim, este exercicio vai unir os pokemons com a reciclagem de
tampas, isto é vai identificar diferentes pokemons dependendo da cor da tampa encontrada. Para
isso o a primeira parte do programa deve conseguir identificar circulos de uma determinada cor
em uma imagem inserida pelo utilizador e substituir o circulo pelo respetivo pokemon. Deve
tambem contar quantos circulos, da respetiva cor, existem na imagem. Apos ter reconhecido os
pokemons numa imagem estatica passamos assim para o ultimo passo, o reconhecimento video.
Deve assim por fim permitir reconhecer os pokemons presentes nas imagens em tempo
real da camera do dispositivo.
def showalgorithm():
print("luminance = 0.2126 * red + 0.7152*green+0.0722*blue")
De seguida prosegui a criar a funcao color2gray() que ira receber como parametro uma cor e
irá devolver a escala de cinzento da cor introduzida.
def color2gray(color):
return 0.2126 * color[0] + 0.7152 * color[1] + 0.0722 * color[2]
Para chamar esta funçao é nescessario pedir pedir ao utilizador os valores RGB da cor que
pretende converter.
R = int(input("R value:"))
G = int(input("G value:"))
B = int(input("B value:"))
color = (R,G,B)
gray_color = Funcoes.color2gray(color)
print(f"The shade of gray of RGB{color} is: {int(gray_color)}")
Funcoes.show_image_color(gray_color)
input("Press enter to continue ...")
Apos ter criado a funçao posso assim proceder ao primeiro uso dela que consiste em calcular a
escala de cinzento da cor RGB(154,50,20).
color = (154,50,20)
gray_color = Funcoes.color2gray(color)
print(f"The shade of gray of RGB{color} is: {int(gray_color)}")
De seguida, para uma melhor interpertaçao do utilizador mostro uma imagem de 200x200 com
a cor recebida.
Funcoes.show_image_color(gray_color)
input("Press enter to continue ...2")
A funcao show_image_color() recebe como parametro uma cor (R,G,B) e cria uma imagem
com esses valores para todos os pixeis. Por fim mostra um grafico com essa imagem.
def show_image_color(color):
image = np.zeros((200,200,3), dtype=np.uint8)
image[:,:] = color
plt.imshow(image)
plt.show()
Apos se verificar que a funçao faz o presuposto, podemos agora adaptar uma funcao que utiliza
a funcao color2rgb() para passar uma imagem para escala de cinzento.
def img2gray(file):
img = imread(file)
colors = (img[:,:,0],img[:,:,1],img[:,:,2])
gray = color2gray(colors)
plt.imshow(gray,cmap = 'gray')
plt.show()
Esta funçao recebe como parametro o camihno para a imagem. Apos abrir a imagem guarda as
cores de todos os pixeis no tuple cores. Este tuple é enviado para a funcao color2gray() que
vai transformar todos os valores nele contidos para escla de cinzento. De seguida é mostrada a
imagem em escala de cinzentos.
Para executar esta funcao é nescessario pedir ao utilizador apenas o caminho da imagem
def showavg(file):
img = imread(file)
im = np.array(img)
w,h,d = img.shape
im.shape = (w*h, d)
average_color = np.average(im, axis=0)
print(f"The average color for your image is:
{int(average_color[0]),int(average_color[1]),int(average_color[2])}")
show_image_color(average_color)
Para chamar esta funçao apenas é nescessario pedir o caminho da imagem que se pretende
utilizar.
De seguida desenvolvi uma outra funçao que consegue obter o pixel solicitado pelo utilizador.
Esta funcao vai receber como parametros o caminho da imagem e a posicao (x,y) do pixel
desejado.
def getpixel(file,x,y):
img = imread(file)
print(f"The RGB values for that pixels are: {img[y][x]}")
show_image_color(img[y][x])
Apos se mostrar os valores do pixel pode-se entao proceder á sua alteraçao. Para isso são
pedidios os valores RGB da cor para a qual pretende trocar o pixel.
def changepixel(file,x,y):
img = imread(file)
img[y][x][0] = input("Value off R:")
img[y][x][1] = input("Value off G:")
img[y][x][2] = input("Value off B:")
plt.imshow(img)
plt.show()
def higherrgb(file):
img = imread(file)
h,w = img.shape[:2]
soma_cores=0
for y in range(h):
for x in range(w):
if soma_cores <
int(img[y][x][0])+int(img[y][x][1])+int(img[y][x][2]):
soma_cores =
int(img[y][x][0])+int(img[y][x][1])+int(img[y][x][2])
max_x=x
max_y=y
cv2.circle(img, (max_x,max_y), 2, 1)
cv2.rectangle(img, (max_x-10, max_y+10), (max_x+10, max_y-10), 1)
print(f"The pixel with the highest RGB vale is {(max_y,max_x)} as R =
{img[max_y][max_x][0]},G = {img[max_y][max_x][1]} and B =
{img[max_y][max_x][2]} ")
plt.imshow(img)
plt.show()
def rotate90(img):
h,w = img.shape[:2]
rotate_img = np.zeros([w,h,3],np.uint8)
for y in range(h):
for x in range(w):
rotate_img[x,y]=img[h-y-1,x]
return rotate_img
Esta funcao recebe como parametro uma imagem que deve ser anteriormente pedida
ao utilizador.
file = input("Please insert the image path: ")
image = Funcoes.imread(file)
rotated_image = Funcoes.rotate90(image)
De seguida para redimensionar uma imagem para 1/4 do tamanho original é nescessario
obter a altura e a largura da imagem original e, a partir desses dados, criar uma imagem nova
que terá a altura/4 e a largura/4 da imagem original. Apos se ter criado a imagem passo a copiar
os pixeis para a nova imagem em que cada pixel da imagem original vai equivaler a 0.25 do pixel
da imagem redimensionada, isto é, cada pixel da imagem redimensionada equivale a 4 pixeis da
imagem original.
def my_rescale(img):
w,h = img.shape[:2]
xNew = int(w / 4)
yNew = int(h / 4)
Rescaled = np.zeros([xNew, yNew,3],np.uint8)
for i in range(xNew):
for j in range(yNew):
Rescaled[i, j]= img[int(i * 4),int(j * 4)]
return Rescaled
Esta funçao recebe como parametro uma imagem e retorna uma imagem que de seguida
é mostrada ao utilizador .
file = input("Please insert the image path: ")
image = Funcoes.imread(file)
Rescaled_image = Funcoes.my_rescale(image)
Funcoes.plt.imshow(Rescaled_image)
Funcoes.plt.show()
input("Press enter to continue ...")
2.4. Scikit-image
Este exercicio é construido com varias funcoes que possibilitam modificar a imagem
original. Criei assim tambem uma funcao que mostra a imagem no estado inicial e a imagem no
estado atual com todas as modificaçoes realizadas ate ao momento.
def show_original_new(new_image,image):
plt.subplot(121)
plt.imshow(image)
plt.title("Original image")
plt.subplot(122)
plt.imshow(new_image)
plt.title("Final Image")
plt.show()
Esta funçao recebe a imagem original e a imagem atual e mostra-as lado a lado para
permitir verificar as alteraçoes realizadas.
Começando entao pelas funcoes que alteram a imagem temos assim a funcao
changebackground() que vai receber uma imagem e alterar todos os pixeis de cor branca
(valores superiores a RGB(240,240,240)) e alteralos para a cor que o utilizador pretender. Para
uma melhor organizaçao esta cor é solicitada logo no inicio da funcao. Esta funcao apenas pode
ser usada uma vez ja que apos trocar o fundo ja não irão existir pixeis brancos que possam ser
alterados.
def changebackground(image):
print("Insert the values for the background color")
R=input("R:")
G=input("G:")
B=input("B:")
print("Changing Background ...")
h,w = image.shape[:2]
for i in range(h):
for j in range(w):
if image[i][j][0]>240 and image[i][j][1]>240 and
image[i][j][2]>240:
image[i][j][0] = R
image[i][j][1] = G
image[i][j][2] = B
print("Background Successfully Changed ")
image = cv2.medianBlur(image,5)
return image
De seguida temos a funcao resize_image() que vais receber uma imagem e redimensionala.
Para redimensionar uma imagem temos 2 opcoes :
1. Resize
2. Rescale
Sendo assim o utilizador é questionado sobre o metodo que pretente utilizar logo no inicio da
funçao.
def resize_image(image):
option = int(input("Chose the option:\
\n1.Resize\
\n2.Rescale\
\nOption:"))
Caso o utilizador escolha dar resize na imagem terá que introduzir a nova altura e a nova largura
da imagem.
if option == 1:
image = resize(image,(int(input("Please insert the new
height:")),int(input("Please insert the new weight:"))))
return image
Caso o utilizador escolha dar Rescale na imagem terá que introduzir apenas a escala que pretente
usar.
elif option == 2:
image = rescale(image,float(input("Please insert the scale yo
use:")),channel_axis=2)
return image
De seguida temos a funçao flip_image() que vai receber uma imagem e assim como o nome
indica vai vira-la no eixo do x ou no eixo do y.
def flip_image(image):
option = int(input("Chose the option:\
\n1.Horizontally\
\n2.Vertically\
\nOption:"))
if option == 1:
return flipud(image)
elif option == 2:
return fliplr(image)
Outra funcao é a rotate_image() que irá receber uma imagem e pedir ao utilizador o angulo
que pretende rodar a imagem.
def rotate_image(image):
return rotate(image, angle=int(input("Insert the angle to rotate:")))
Por fim temos a funçao crop_image() que vai receber uma imagem e pedir ao utilizador os
pontos de inicio e os pontos de fim que pretende utilizar.
def crop_image(image):
return image[int(input("Start x:")):int(input("End
x:")),int(input("Start y:")):int(input("End y:"))]
Todas estas funcoes sao executadas apenas quando o utilizador se encontra no menu do
exercicio 4 e escolhe a funçao. É assim executada a funcao escolhida e de seguida é mostrado
lado a lado a imagem original e a imagem com a alteraçao realizada.
def readplate(image):
rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
rgb = cv2.medianBlur(rgb,1)
results = pytesseract.image_to_data(rgb, output_type=Output.DICT)
for i in range(len(results["text"])):
x = results["left"][i]
y = results["top"][i]
w = results["width"][i]
h = results["height"][i]
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
De seguida passo a imagem para o esquema de cores HSV para cria de seguida uma mascara que
vai identificar apenas a cor preta, que neste caso será o numero da matricula, e ignorar o
resto.Apos ter criado a mascara, com o auxilio dos pontos do retangul separo apenas os
numeros da matricula e de seguida desfoco a imagem para facilitar o reconhecimento do texto.
Por fim removo o (\n\f) que existe no fim da leitura de texto para um melhor aspeto ao mostrar
a imagem.
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
lower_bound = np.array([0,0,0])
upper_bound = np.array([50,50,50])
mask = cv2.inRange(hsv,lower_bound,upper_bound)
matricula = mask[y:y+h,x:x+w]
matricula = cv2.medianBlur(matricula,15)
text = pytesseract.image_to_string(matricula,config="--psm
6",lang="eng")
text = text.replace('\n\f','')
cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 0, 200), 2, cv2.LINE_AA)
print(f"The license plate is:{text}")
plt.imshow(image)
plt.show()
def imagepokemon(image,n_pokemon):
circles = 0
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
gray = cv2.medianBlur(gray,9)
hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
hsv = cv2.medianBlur(hsv,5)
circle = cv2.HoughCircles(image =
gray,method=cv2.HOUGH_GRADIENT,dp=1.5,minDist=80,param1=110,param2=70,max
Radius=80)
Apos identificar todos os círculos presentes na imagem, caso existam círculos, vou
percorrer o array de círculos e buscar as coordenadas do centro e o raio de cada círculo.
Através de esses dados posso assim descobrir qual a cor do círculo (assumo a cor do centro).
De seguida dependendo do Pokémon que o utilizador escolheu será ou não mostrado o
Pokémon com a cor do círculo atual. Apos ter verificado qual o Pokémon que corresponde ao
círculo atual, a imagem do Pokémon é redimensionada para o diâmetro do circulo e por fim
inserido na imagem.
pokemon = chosesquirtle(cores)
if pokemon is not None:
circles +=1
resize =
cv2.resize(pokemon,(i[2]*2,i[2]*2),interpolation = cv2.INTER_AREA)
image[i[1]-i[2]:i[1]+i[2],i[0]-i[2]:i[0]+i[2]]=resize
# cv2.circle(image,(i[0],i[1]),i[2],(0,255,0),3)
Por fim escrevo no canto da imagem qual a quantidade de Pokémons da cor escolhida existem
na imagem e mostro a imagem com os Pokémons escolhidos substituídos.
if n_pokemon != 5:
cv2.putText(image, pokemons[n_pokemon-1]+str(circles), (10,30),
cv2.FONT_HERSHEY_SIMPLEX,
1, text_color[n_pokemon-1], 2, cv2.LINE_AA)
cv2.imshow('Pokemons',image)
print("b.\nLoading...")
cam=cv2.VideoCapture(0)
vid = cv2.VideoCapture(0)
n_pokemon = Funcoes.chosepokemon()
print("Press s key to stop")
while(True):
ret,image = vid.read()
Funcoes.imagepokemon(image,n_pokemon)
if cv2.waitKey(1)&0xFF == ord('s'):
break
vid.release()
cv2.destroyAllWindows()
return cores
2.7. Menus
Para uma melhor organização decidi criar uma funçao para cada menu.
Qualquer escolha que esteja fora dos parametros do programa será avisada ao ser
introduzida.
def menu_inicial():
return int(input("Choose the exercise you want to perform\
\n1. Understanding the basics of gray image processing\
\n2. Understanding the basics of color image processing\
\n3. Understanding the basics of image transformations\
\n4. Scikit-image\
\n5. OpenCV-Licence Plate\
\n6. OpenCV-Pokemon\
\n7. Exit\
\nExercise:"))
def chosepokemon():
return int(input("Chose the pokemon to be shown:\
\n1.Charmander\
\n2.Pikachu\
\n3.Bulbasaur\
\n4.Squirtle\
\n5.All pokemons\
\nOption:"))
3. Resultados
Aqui pode confirmar os outputs de cada exercicio/alinea
Ao executar o programa ira ver o Menu inicial onde poderá escolher o exercicio que
quer executar.
Output 3: Algoritmo
Para continuar terá de fechar o gráfico através do X do canto ou pressionando a tecla “Q”.
Ira de seguida ser mostrado o valor da cor media da imagem seguido de um gráfico com a cor
representada.
De seguida são pedidos os valores RGB com quais pretende substituir o pixel selecionado.
Output 16:Coordenadas e valores do pixel com os valores RGB mais elevados da imagem
papagaio.jpg
De seguida será mostrada a imagem com o pixel dentro de uma mira. A mira estará pequena
em imagens de grandes dimensões.
A imagem será redimensionada e cada 4 pixels da imagem original irão equivaler a 1 pixel da
imagem redimensionada. O resultado será o seguinte:
3.4. Scikit-image
Ao escolher a opção 4 terá de introduzir o caminho da imagem que deseja utilizar.
Deverá utilizar uma imagem com fundo branco para melhores resultados.Todas as alíneas estão
seguidas logo as alterações são quanto a imagem presente na alinea anterior.
Apos ter escolhido a imagem que será utilizada ser-lhe-a mostrado o menu do exercicio 4 onde
pode escolher quais alteraçoes deseja fazer á imagem.
3.4.b.1. Resize
Ao escolher a 1. terá que introduzir os novos tamanhos da imagem.
Apos introduzir os dados pedidos será mostrada a imagem com os novos tamanhos.
3.4.b.2. Rescale
Ao escolher a 2. terá de introduzir a escala que pretende utilizar.
Apos introduzir uma escala valida será mostrada a imagem com os novos tamanhos.
Grafico 13:Imagem com fundo vermelho e tamanho em escala 0.5 em relação a alínea anterior
Apos introduzir o angulo a imagem será rodada e de seguida exibida com as alterações realizadas.
3.4.d.2. Vertically
Ao escolher a opcao 1. a imagem será invertida quanto ao eixo do x.
Será também mostrada a matrícula selecionada e o seu devido número por cima da caixa.
3.6. OpenCV-Pokemon
Ao escolher a opção 6 ser-lhe-á mostrado o menu do exercício 6 em que poderá
escolher a alínea que deseja executar.
Apos importar o ficheiro terá de escolher qual o Pokémon que quer identificar na imagem.
3.6.a.1/4. Charmander,Pikachu,Bulbasaur,Squirtle
Ao escolher uma opção de 1 a 4 ser-lhe-á apenas identificado o Pokémon em questão.
3.7. Exit
Ao escolher a opçao 7 tal como o nome indica irá sair do programa.
4. Discussão
Este trabalho pratico foi mais complicado que o anterior principalmente pelo facto de
em alguns dos exercícios não se poder utilizar as bibliotecas já existentes. Foi nescessario
criarmos as nossa propiás funções o que até foi algo desafiador e interessante.
No primeiro exercicio tive algumas duvidas devido ao uso do cmap =”gray”, não tinha a
certeza se se podia usar ou não. Decidi mostrar a cor através de uma imagem de 200x200 pixeis
para melhorar a interaçao com o utilizador.
No segundo exercicio na alinea a) não percebi bem o que o enunciado queria ao dizer
que devemos calcular o significado de cada cor, por isso apenas fiz o que percebi que foi calcular
a cor media e representala. Na alinea b decidi criar 2 funcoes separadas para cada uma das
tarefas. Isto ajuda caso nescescite de usar uma delas em um sub-programa posterior. Na alinea
c) estava a ter problemas por causa de a função não guardar o valor mais alto e passar por todos
os pixeis, cheguei a conclusão que era um problema a condição que verificava se a soma da cor
do pixel atual é maior do que a soma da cor do pixel guardado.
No exercicio 3 na alinea a) descobri mais para o fim que a imagem não rodava apenas,
ela também ficava refletida quanto ao eixo do x. Resolvi este problema ao alterar os valores que
iam ser copiados da imagem principal para a imagem rodada.
O exercicio 3 alinea b) foi um dos mais fáceis do trabalho pratico já que apenas se tinha
de percorrer a imagem original e copiar os pixeis de 4 em 4 para a imagem nova. Este método
diminui muito a qualidade da imagem já que muito pixeis são perdidos pelo processo.
No exercicio 4 tentei implementar todas as funcionalidades que o enunciado pedia mas
mesmo assim não tenho a certeza se faltava algo,fiquei confuso se devia ou não permitir ao
utilizador aplicar filtros na imagem.
No exercicio 5 utilizei uma biblioteca que ainda não lecionamos que é a Output(«How
to Use the Pytesseract.Output.DICT Function in Pytesseract | Snyk») do pytesseract.Utilizei-a
para ler a posição do texto para poder selecionar a matricula só nas bordas ignorando assim as
linhas interiores.
No exercicio dos pokemons consegui desenvolver rapidamente uma função para
reconhecer os circulos e contar o numero de circulos de cada cor. O que complicou mais foi a
parte de ler da camera, isto porque os circulos na camera não stao fixos num só lugar e o seu
tamanho pode variar muito rapidamente e alterar os valores do circulo, quan do isto acontece
impossibilita copiar a imagem do pokemon que esta do tamanho do circulo anterior para o
circulo atual ja que os tamanhos sao diferente. Tentei varias condições para resolver este
problema mas ainda acontece de vez em quando ,quando são feitos movimentos muito bruscos
ou caso o circulo saia para fora da imagem rapidamente.
Este trabalho levou no total cerca de 24 horas em que 12 horas foram o
desenvolvimento do relatorio.Sempre estou presente nas aulas o que permitiu uma facil
compreençao do trabalho.Em media costumo gastar 7/8 horas semanais extracurriculares com
a disciplina para o desenvolvimento de trabalhos e curiosidades que venho tendo.
5. Conclusão
Em geral achei este trabalho pratico mais complexo que o anterior, isto também se
deve ao facto de ter confruntado muito mais problemas devido a erros e outros motivos.
Python continua a ser uma linguagem interessante mas complica um bocado quando não se
pode ter acesso a bibliotecas que já facilitam algumas funcionalidade. Concluo assim que
python permite criar muitos programas interessantes mesmo sem o auxilio de bibliotecas,
mas com uma complexidade mais elevada.
Referências
Hoffstaetter, Samuel. pytesseract: Python-tesseract is a python wrapper for Google’s
20 de novembro de 2022.