terça-feira, 4 de junho de 2019

OpenCV e Convex Hull

Rapaaaaaaaaaaaz, eu vou postar esse código aqui porque eu não achei em nenhum canto na internet uma pagina mostrando uma demo de convex hull

Podem usar a vontade!
Nosso código pra mostrar mostrar na tela a imagem da webcam e o Convex Hull, no caso eu to fazendo de objetos da cor amarela ou da cor verde
import cv2
import numpy as np


#epsilon = 0.1*cv2.arcLength(cnt,True)
# approx = cv2.approxPolyDP(cnt,epsilon,True)

#criando uma funcao
def nothing(x):
pass

cap = cv2.VideoCapture(0)

def make_1080p():
cap.set(3, 1920)
cap.set(4, 1080)

def make_720p():
cap.set(3, 1280)
cap.set(4, 720)
def make_480p():
cap.set(3, 640)
cap.set(4, 480)

def change_res(width, height):
cap.set(3, width)
cap.set(4, height)

make_480p()

loweryellow = np.array([13, 118, 100])
upperyellow = np.array([35, 255, 255])

lowergreen = np.array([33, 79, 51])
uppergreen = np.array([81, 255, 255])

while True:
_, frame = cap.read()
blurred_frame = cv2.GaussianBlur(frame, (5, 5), 0)
hsv = cv2.cvtColor(blurred_frame, cv2.COLOR_BGR2HSV)

#yellow
maskyellow = cv2.inRange(hsv, loweryellow, upperyellow)
cntyellow,hierarchyyellow = cv2.findContours(maskyellow, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cntyellow = sorted(cntyellow, key=cv2.contourArea, reverse=True)
totalyellow = len(cntyellow)

#green
maskgreen = cv2.inRange(hsv, lowergreen, uppergreen)
cntgreen,hierarchygreen = cv2.findContours(maskgreen, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cntgreen = sorted(cntgreen, key=cv2.contourArea, reverse=True)
totalgreen = len(cntgreen)

x, y, w, h, cor = -1, -1, -1, -1, "nenhuma"
areaYellow, areaGreen = 0, 0

if(totalyellow > 0):
hullyellow = cv2.convexHull(cntyellow[0])
cv2.drawContours(frame, [hullyellow], -1, (0, 232, 255), 4)
areaYellow = cv2.contourArea(hullyellow)
#agora isso aqui com certeza eh lixo, mas nao tem como saber a posicao sem isso
posxYellow,posyYellow,wYellow,hYellow = cv2.boundingRect(hullyellow)

if(totalgreen > 0):
hullgreen = cv2.convexHull(cntgreen[0])
cv2.drawContours(frame, [hullgreen], -1, (0, 255, 0), 4)
areaGreen = cv2.contourArea(hullgreen)
#agora isso aqui com certeza eh lixo, mas nao tem como saber a posicao sem isso
posxGreen,posyGreen,wGreen,hGreen = cv2.boundingRect(hullgreen)


cv2.imshow("frame", frame)
key = cv2.waitKey(1)
if key == 27:
break

if (areaGreen > areaYellow):
cor = "verde"
x = posxGreen
y = posyGreen
w = wGreen
h = hGreen
elif(areaGreen < areaYellow):
cor = "amarelo"
x = posxYellow
y = posyYellow
w = wYellow
h = hYellow
elif(areaGreen == 0 and areaYellow):
cor = "nenhuma"

print (cor)
cap.release()
cv2.destroyAllWindows()

Nosso código pra identificação de cor de caixa (se é verde ou amarela)
import cv2
import numpy as np

#criando uma funcao
def nothing(x):
pass

cap = cv2.VideoCapture(0)

def make_1080p():
cap.set(3, 1920)
cap.set(4, 1080)

def make_720p():
cap.set(3, 1280)
cap.set(4, 720)
def make_480p():
cap.set(3, 640)
cap.set(4, 480)

def change_res(width, height):
cap.set(3, width)
cap.set(4, height)

#make_480p()

def identificacor(img):
frame = img
blurred_frame = cv2.GaussianBlur(frame, (5, 5), 0)
hsv = cv2.cvtColor(blurred_frame, cv2.COLOR_BGR2HSV)

loweryellow = np.array([13, 118, 100])
upperyellow = np.array([35, 255, 255])

lowergreen = np.array([33, 79, 51])
uppergreen = np.array([81, 255, 255])


#yellow
maskyellow = cv2.inRange(hsv, loweryellow, upperyellow)
cntyellow,hierarchyyellow = cv2.findContours(maskyellow, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cntyellow = sorted(cntyellow, key=cv2.contourArea, reverse=True)
totalyellow = len(cntyellow)

#green
maskgreen = cv2.inRange(hsv, lowergreen, uppergreen)
cntgreen,hierarchygreen = cv2.findContours(maskgreen, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cntgreen = sorted(cntgreen, key=cv2.contourArea, reverse=True)
totalgreen = len(cntgreen)

x, y, w, h, cor = -1, -1, -1, -1, "nenhuma"

if(totalyellow > 0):
hullyellow = cv2.convexHull(cntyellow[0])
cv2.drawContours(frame, [hullyellow], -1, (0, 232, 255), 4)
areaYellow = cv2.contourArea(hullyellow)
#agora isso aqui com certeza eh lixo, mas nao tem como saber a posicao sem isso
posxYellow,posyYellow,wYellow,hYellow = cv2.boundingRect(hullyellow)

if(totalgreen > 0):
hullgreen = cv2.convexHull(cntgreen[0])
cv2.drawContours(frame, [hullgreen], -1, (0, 255, 0), 4)
areaGreen = cv2.contourArea(hullgreen)
#agora isso aqui com certeza eh lixo, mas nao tem como saber a posicao sem isso
posxGreen,posyGreen,wGreen,hGreen = cv2.boundingRect(hullgreen)

if (areaGreen > areaYellow):
cor = "verde"
x = posxGreen
y = posyGreen
w = wGreen
h = hGreen
elif(areaGreen < areaYellow):
cor = "amarelo"
x = posxYellow
y = posyYellow
w = wYellow
h = hYellow
elif(areaGreen == 0 and areaYellow):
cor = "nenhuma"

w = w/2
h = h / 2
x = x + w
y = y + h

return cor, x, y, w, h

def identificacorimagem (imagem):
img = cv2.imread(imagem, cv2.IMREAD_COLOR)
cor, x, y, w, h = identificacor(img)
return cor, x, w, w, h


def identificacorimgcamera ():
make_480p()
_, frame = cap.read()
cor, x, y, w, h = identificacor(frame)
return cor, x, w, w, h


testecor, testex, testey, testew, testeh = identificacorimgcamera ()
print(testecor)

if testecor == "amarelo":

testecor, testex, testey, testew, testeh = identificacorimagem ('quad8.jpg')
print(testecor)


Referencias:
https://www.youtube.com/watch?v=nspSQSU_zvk&t=21s
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.html
https://www.pyimagesearch.com/2014/08/04/opencv-python-color-detection/
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

quarta-feira, 15 de maio de 2019

SO PRA ANOTAR NO MEU DIARIU

Rapaaaaaaaaaaz aconteceu uma parada muito estranha (PRA MIM)
hoje eu tava de boa na universidade estudando numa sala lá, o GECEL e taaaaal, tinha eu e uma galera lá aproveitando a internet
Aí eu já ia saindo pra cumê, aí apareceu um cara que perguntou onde tava um membro dum bagulho lá, o DCE, aí eu falei que onde achava que era o bagulho, pra ver se ele achava o cara e taaaal, aí engatou um papo com uma menina lá
*parte importante*
NUM SEI COMO, MAS EU PISQUEI E ELA CONTOU TODA A HISTORIA DE VIDA DELA E EU QUASE CHOREI JUNTO PORQUE ELA JA TAVA CHORANDO TAMBEM QUASE
Tentei ouvir ela, porque eu acho que do jeito que ela tava eu acho que só queria alguém pra ouvir, e eu também não sabia o que falar xDD
Ela é de matemática, num sei se vou encontrar ela de novo
Nem falei o meu nome porque eu achei que ela ia me esquecer
Pra mim foi super inesperado porque eu realmente vou me formar sem ter conhecido praticamente ninguém
A galera dos outros cursos é realmente bem mais legal do que o do meu, tudo bicho antisocial aqui mermo
Vou ficar desejando boa sorte pra ela u.u

domingo, 5 de maio de 2019

Sistemas Operacionais - p00 - queue.c

Eu vou TENTAR fazer uma série de posts explicando como fazer os labs e também colocando os meus códigos-fonte, infelizmente esse post não vai ser util pra mim e pros meus amigos que estão fazendo a matéria esse semestre, mas  a esperança é que esse post e mais alguns outros ajudem os alunos desesperados do futuro.
Se você chegou aqui é porque:

  • Você faz SO na UFPR 
  • Você faz SO na UTFPR 
  • Você é um curioso sobre SO
  • Você é um seguidor do meu blog, estava esperando um desenho e do nada aparece um monte de coisas de programação e agora está confuso (se está esperando um desenho e leu até aqui, espera que depois eu vou postar alguma parada aqui xD)

Se você faz parte de um dos dois primeiros grupos, só lamento meu amigo......
Mas eu to aqui pra ajudar e dividir o meu codigo com você, e fazer essa dor de fazer essa matéria menos aguda, maaaaaaaaaaaaaaaaaaaaaaaas.........
O Maziero e o meu professor na UTFPR devem usar um programa anti-plágio, então algumas estratégias que eu recomendo pra contornar isso são:

  • Mudar nome de variáveis
  • Mudar a métrica do código (distancia entre as estruturas) 
  • Numero de ocorrências das variáveis 
  • Mudar a estrutura (no caso se usa um 'while', troca por um 'do while' ou um 'for'. Se usa o if == 0 e um else, usa um if != 0 e faz a lógica contraria)
  • Mudar o estilo de programação (prefiro usar milhões de if's e else's do que um switch case, porque eu acho que é muito fácil escrever errado, esquecer um break e aí já parar de funcionar. No caso, isso foi o que o meu professor de programação a muito tempo tinha me ensinado, então o estilo de programação do professor conta também como estratégia pra detectar plágios)

Se eles ainda pegarem no seu pé, aí eu acho injustiça, porque aí você vai ter que fazer um código que faça outra coisa que não é, por exemplo fila, elas vão acabar sempre tendo uma estrutura parecida de lista com lógica FIFO
Você pode com certeza fazer um código e semelhanças serão inevitáveis, o próprio Maziero dá algumas linhas de código que você é imposto a pôr no seu código pra depuração, aí tu vai estar plagiando do Maziero? Só num pega pesado se for 'copiar'
No caso, o meu professor que é preguiçoso ao extremo, ao ponto de fazer os alunos corrigirem as provas uns dos outros não tinha que reclamar de aluno preguiçoso. Cobrar coisa que não passou, etc.....
Pra mim esse negocio anti-plagio tinha que ter somente em artigos acadêmicos ou na industria e no mercado de trabalho, mas se os alunos concordam entre si de compartilhar o código, e forem muito bem nas provas, não há nenhum problema. Espero que isso mude nos próximos semestres

Esse é o código do projeto p00 do Maziero, do queue.c
Eu acabei vendo um monte de video aulas do Canal Linguagem C Programação Descomplicada no caso as aulas de Estrutura de Dados e de Linguagem C que eu não lembrava nada mesmo

Tentei deixar bem comentado e o mais genérico possível
queue.c:

/* Aluno: Felipe Avelino
*/

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"


//------------------------------------------------------------------------------
// Insere um elemento no final da fila.
// Condicoes a verificar, gerando msgs de erro:
// - a fila deve existir
// - o elemento deve existir
// - o elemento nao deve estar em outra fila

void queue_append (queue_t **queue, queue_t *elem) {
//queue = fila
//a gente usa a flexinha pra ponteiros
//ptr->membro = (*ptr).membro
//muito mais intuitivo
//(*(*(*a).b).c).d // não intuitivo
//a->b->c->d // intuitivo
// Insere um elemento no final da fila.
// - o elemento nao deve estar em outra fila
//printf("funcao invocada!");

//**queue eh um ponteiro de ponteiro que aponta pro primeiro
//elemento da lista, pra percorre-la, nós criamos um elemento
//auxiliar pra copiar o valor do primeiro
//e nao perdermos o valor original

//aproveitando que a fila eh circular e duplamente encadeada

if (queue != NULL) {//a fila deve existir
//queue_t = NULL quer dizer que o ponteiro está vazio
if (elem != NULL) {// - o elemento deve existir
if((elem->next == NULL) && (elem->prev == NULL)) {//o elemento nao deve estar em outra fila
//tudo certo! Pronto pra inserir!
//printf("tudo ceerto! pronto pra inserir!\n");
if (*queue == NULL) {//se a fila for vazia
elem->next = elem;
elem->prev = elem;
(*queue) = elem;
//printf("primeiro elemento na fila\n");
} else {//se a fila nao for vazia
//printf("inseriondo outros elementos na fila\n");
queue_t *first = *queue;
queue_t *last = first->prev;
//coloco o novo elemento no final
last->next = elem;
//o antigo ultimo agora vai ser o penultimo, o proximo dele vai ser elem
elem->prev = last;
//o proximo depois do ultimo vai ser
elem->next = first;
first->prev = elem;

}

}else{
//se elem->next != NULL eh porque ja tem dados salvos de outra fila
printf("Elemento ja pertence a outra fila\n");
}
}else{
printf("Elemento nao existe!\n");
}
}else{
printf("fila inexistente\n");
}
}


//------------------------------------------------------------------------------
// Remove o elemento indicado da fila, sem o destruir.
// Condicoes a verificar, gerando msgs de erro:
// - a fila deve existir
// - a fila nao deve estar vazia
// - o elemento deve existir
// - o elemento deve pertencer a fila indicada
// Retorno: apontador para o elemento removido, ou NULL se erro

queue_t *queue_remove (queue_t **queue, queue_t *elem) {
//queue = minha fila

queue_t *first = *queue;
queue_t *last = first->prev;

queue_t *aux = *queue;


if (queue != NULL && (*queue) != NULL && elem != NULL) {//a fila deve existir
//fila nao esta vazia
//o elemento deve existir
//vamos procurar o elemento na fila
//se nao encontrar nao pertence a ela
queue_t *anterior = elem->prev;
queue_t *proximo = elem->next;
//printf("removendo elementos!\n");

if (elem == *queue) {//se o elemento esta no inicio, remove do inicio
if (elem->next == elem) {//somente um elemento
//printf("removendo o unico!\n");
elem->next = NULL;
elem->prev = NULL;
*queue = NULL;
return elem;
}else{
//last->next = proximo;
//proximo->prev = last;
aux->prev->next = aux->next;
aux->next->prev = aux->prev;


*queue = proximo;//mudamos o inicio
//printf("removendo do inicio\n");

//free(elem);
elem->next = NULL;
elem->prev = NULL;
return elem;
}


}else{//senao vamos ter que percorrer os outros elementos
aux = aux->next;
//printf("procurando elemento!!!\n");
while (aux != (*queue) && aux != elem) {
anterior = aux;
aux = aux->next;
proximo = aux->next;
}

if (aux == (*queue)){//se percorreu e nao achou
printf("elemento nao encontrado!!!\n");
}else{//se achou
anterior->next = proximo;
proximo->prev = anterior;
//free(elem);
elem->next = NULL;
elem->prev = NULL;
return elem;

}
}
}
return NULL;
}

//------------------------------------------------------------------------------
// Conta o numero de elementos na fila
// Retorno: numero de elementos na fila

int queue_size (queue_t *queue) {
if (queue == NULL) {//fila nao existe
return 0;
}

int tamanho = 0;
queue_t *aux = queue;
queue_t *last = aux->prev;
//printf("executando caso seja diferente de zero\n");

do {
tamanho++;
aux = aux->next;

} while (aux != queue);
return tamanho;
}

//------------------------------------------------------------------------------
// Percorre a fila e imprime na tela seu conteúdo. A impressão de cada
// elemento é feita por uma função externa, definida pelo programa que
// usa a biblioteca. Essa função deve ter o seguinte protótipo:
//
// void print_elem (void *ptr) ; // ptr aponta para o elemento a imprimir

void queue_print (char *name, queue_t *queue, void print_elem (void*) ) {
if (queue != NULL) {//se a fila existe
queue_t *aux = queue;
queue_t *last = aux->prev;
int tamanho = queue_size(queue);
int i = 0;

printf("%s", name);
printf("fila existe!!!\n");
while (i != tamanho) {
print_elem(aux);
aux = aux->next;
i++;
}
}else{
printf("A fila nao existe!!!\n");
}
}

Eu vou melhorando esse post com o tempo, até mais pessoal azarado que for fazer S.O. xD

sábado, 30 de março de 2019

Lista de animes que eu vi xD

Hoje eu passei o dia organizando a minha lista de animes que eu vi
É que eu tenho tipo um diário e lá eu consegui anotar um monte de coisas, jogos que eu joguei em tal ano e os animes e mangás que eu vi xD
Recomendo pra quem não fez fazer, é até que divertido xD
Se bem que eu nunca acessei, mas o myanimelist deve fazer isso já PFFFF


Vistos em 2009:

  1. Bleach
  2. FMA Brotherhood

Vistos em 2011:

  1. Tengen Toppa Gurren Lagannn
  2. Evangelion
  3. Bakuman
  4. crayon Chin Chan
  5. Nadesico

Vistos em 2012:

  1. Guilty Crown
  2. Black Rock Shooter
  3. FLCL
  4. Nichijou

Vistos em 2013:

  1. Kill la Kill
  2. Akira
  3. Ghost in the Shell
  4. Filmes do Studio Ghibli
  5. BlazBlue

Vistos em 2014:

  1. Space Dandy
  2. Trigun (nov 2014)
  3. Samurai X
  4. Yuyu Hakusho

Vistos em 2015

  1. Cowboy Bebop
  2. Samurai Champloo
  3. Toki Wo Kakero Shoujo
  4. O Conto da Princesa Kaguya
  5. Grave of the Fireflies

Vistos em 2016:

  1. Soul Eater
  2. Blood+
  3. Tekkon Kinkreet
  4. Genius Party

Vistos em 2017:

  1. Basilisk ★
  2. Hellsing ★
  3. Parasyte ★ (comecei em 2015, mas só terminei em 2017)
  4. Blood+ ★
  5. Ranma 1/2 ★
  6. Boku no Hero
  7. Berserk ★
  8. GTO ★
  9. Dragon Ball Super
  10. Durarara ★
  11. baccano ★
  12. Steins Gate ★
  13. Panty and Stocking
  14. Boku dake ga Inai Machi ★
  15. 5 cemntimeters per second
  16. kimi ni no wa
  17. koe no katachi
  18. Hotarubi no Mori e
  19. Perfect Blue

Vistos em 2018:

  1. Dragon Ball Super
  2. Devilman crybaby ★
  3. madoka magica ★
  4. Inuyashiki ★
  5. Golden Boy ★
  6. Violet Evergarden ★
  7. Steins Gate Zero ★
  8. Boku no hero ★
  9. Litte Witch Academia ★
  10. Megalo Box ★
  11. Darling in the Franxx ★
  12. Yoru wa mijikashi arukeyo otome
  13. Hunter x Hunter (comecei a assistir)

Vistos em 2019 (o ano num terminou, então talvez essa lista aumente)

  1. Dororo
  2. Mob Psycho II
  3. Sailor Moon (comecei a ver)
  4. Hajimeno ippo (comecei a ver)
  5. Kimi ni todoke
  6. Akame ga Kill
  7. Nana

★ = Foram os animes que eu assisti até o final

Vou voltar sempre pra editar essa lista u.u


quarta-feira, 19 de setembro de 2018

Mais desenhos de roupas!!!

TO COM PREGUIÇA DE DIGITAR ENTAO EH ISSO AI GALERA U.U




segunda-feira, 3 de setembro de 2018

Adventure Time Finale

The end of a great history....

sábado, 1 de setembro de 2018

SKETCHTEMBER 2018

Eu vou trapacear um pouco no meu sketchtember e postar os sketches prontos que eu já tenho no meu sketchbook ao invés de fazer um por dia
Porque pra fazer do jeito qeu eu gosto realmente não ia dar pra encher uma pagina por dia.... u.u



(Esse rosto do velho eu me baseei num desenho do Katsuya Terada u.u)



Esse post vai  ser editado com o tempo

quinta-feira, 30 de agosto de 2018

Secret of mana!!!

Zerei finalmente o Secret of mana com o meu irmão jogando online (⌐■_■)
Finalmente tenho paz de espirito....
Queria documentar assim sempre que eu zerasse um jogo x'D
Acho que é pra isso que serve esse blog... u.u



domingo, 19 de agosto de 2018

Mais skecthes

Só queria lembrar que todas essas paginas de sketches demoram pra encher u.u




Uma historinha rapida

Só escrevendo aqui uma historia engraçada xD
Rapaz.... Teve uma vez que eu desenhei uma menina no meu sketchbook, só que eu só conhecia de vista, num sabia nem o nome
E logo no dia seguinte, depois de eu ter desenhado ela, uma colega me apresentou a e ela viu o desenho, aí eu falei que não era ela, mas só que tava muito igual
Num sei nem se ela acreditou, mas eu chutei que o nome dela era Jeniffer e aí realmente era o nome da menina meu deus...... Do nada eu acho que tinha ganhado incríveis poderes de adivinhação
Eu menti pra ela porque sou besta