Como abrir os pixels de uma imagem e comparar com outra - C/C#/C++ - Clube do Hardware
Como abrir os pixels de uma imagem e comparar com outra
Por Mayrinck Bernardo, 14 de janeiro em C/C#/C++
Ola estou com um projeto de um programa que compara um print de tela com outra imagem semelhante e mostra as diferenças. Preciso saber como posso fazer isso entao pensei que seja possivel abrir os pixels da imagem para comparar. Ate o momento so tenho experiencia em c e c++, deveria migrar para outra linguagem para tentar solucionar isso ou é possivel?.se possivel sera que precisaria de alguma biblioteca especial tipo a allegro ou outra que trabalhe com imagem? Nao pretendo utilizar IA quero algo bem simples. Por onde devo começar?
Para evitar que o o primeiro comentario alguem diga que nao entendeu o projeto e explique mais. Eu preciso apenas distinguir a posicao de um imagem na tela por exemplo: salvarei 2 imagens: na primeiro tenho uma imagem posicionada a esquerda e na outra a mesma imagem a direita. Entao vou tirar um print e o programa ira comparar e dizer se no print a imagem esta a esquerda ou direita ou informar que nao foi encontrada a imagem.
É possível usar C++ sim. Eu recomendo usar uma biblioteca de terceiro, por exemplo:
@Mayrinck Bernardo na linguagem c e c++ , voce pode fazer a comparacao de cada pixel de uma determinada area com outra ,
se voce souber a posicao de cada uma na tela , comparando o valor RGB de cada pixel e com isso verificar se as duas sao iguais , entao voce precisarah usar comandos mais avancados do que os usados no console , e para isso voce pode usar a API do windows , criando um projeto do tipo win32 GUI , e ali use o comando getpixel para pegar o valor RGB do pixel , e com os comandos Rvalue , Gvalue e Bvalue , voce consegue saber a quantidade de cor vermelha , verde e azul que cada um tem , mas dependendo do tamanho da imagen vai demorar bastante para verificar todos os pixeis , faca seu codigo e poste aqui , para vermos como esta e em que podemos ajudar .
Em 16/01/2020 às 18:55, devair1010 disse:
entao voce precisarah usar comandos mais avancados do que os usados no console , e para isso voce pode usar a API do windows , criando um projeto do tipo win32 GUI , e ali use o comando getpixel para pegar o valor RGB do pixel
@devair1010 as imagens pela definição do tópico já foram capturadas. Não vão estar na tela e não há "pixels" mais. Apenas bits na prática. Pode-se usar uma aplicação de console e nem precisa de uma interface especial: apenas a linha de comando fornecendo os nomes das duas telas capturadas e uma terceira com a imagem alvo.
Em 14/01/2020 às 13:49, Mayrinck Bernardo disse:
print de tela com outra imagem semelhante e mostra as diferenças
Dependendo de sua definição de semelhança isso pode ser mesmo o diabo pra escrever e seria o caso de treinar um modelo AI mesmo para reconhecer o padrão.
Mas se for para procurar algo igual no sentido matemático provavelmente não.
Seria melhor postar as tais imagens e definir essa noção de semelhança antes de tudo.
É essencial saber o formato da captura. Definido o formato basta ler as especificações e escrever o código. Ou mesmo usar alguma biblioteca. Fiz algo assim em C e C++ para BMP e JPG então tenho alguns documentos. E classes talvez. Anexo uma versão resumida do formato para JPG e pode ajudar a ter uma ideia para esse formato. Tenho mais material. Escreva mais sobre o projeto
JPEG File Interchange Format 1.02.pdf
@devair1010 @arfneto mas o que seria mais preciso, o que me daria uma resposta mais rápida? um print capturado na hora e comparado com uma imagem já salva. ou uma interação em tempo real com a tela do meu ocmputador se é que isso é possivel? eu pretendo que o programa me der uma resposta em menos de 2 segundos
@vangodp pretendo criar alguns bots para games então pretendo capturar posição dos personagem e fazer alguma ação de acordo. mas não pretendo criar um controlador automatico e nem nada de complicado acho que apenas um printf me informando a posição seria algo extraordinário
Trata-se de uma imagem em movimento? É muito diferente isso. O game tem luz, reflexos, sombras... Se está falando em buscar polígonos na imagem é uma coisa, se está falando em procurar um personagem que se move para decidir se ele está na tela é outra...
2s é um tempo e tanto para comparar as imagens, mas a história pode ser outra. Como vai salvar essa imagem? Em que formato? Qual a resolução do jogo? Interferir com o jogo para capturar a tela é outra história. Como vai fazer?
Quero muito ter essa experiencia. Estou buscando alguns cursos que falam de graficos no youtube mas nao estão me ajudando muito.
Nao consigo entender como explicar uma regiao especifica para o programa e fazer me retornar o resultado esperado mas tenho fé que nesse ano de 2020 vou alcançar esses objetivos. Nao que tenho assim um game especifico mas tenho exemplos que quero desenvolver trabalhando apenas com imagens.
Nessa primeira imagem ilustrativa tem na tela a imagem de um game famoso mmorpg. No seu canto inferior direito ha uma pequena aba chamada battle que apresenta a presença de criaturas proximas ao personagem e caso nao haja criatura fica vazia. Ok entao e fácil programar eu so tenho 2 casos que é vazio ou nao vazio independente de tipo de criatura. If naovazio Printf " uma criatura surgiu". Ok parece simples.É muito fácil encontrar na internet varios programas executaveis e injetaveis que fazem muito mais do que isso atacando diretamente o jogo e mudando completamente. mas trabalhar apenas com imagens me parece ser muito mais inteligente. entao vamos para mais o outro exemplo.
Na segunda imagem temos um famoso game java jogado diretamente pelo browser. No canto superior direito ha um pequeno mapa que resume toda a fase que estiver sendo jogada no momento. onde seu personagem é resumido em um pequeno ponto azul(alguns amigos do time tambem), e seu inimigo em um ponto vermelho. E todo enrredo se resume em saber a distancia exata de um ponto para o outro. O unico misterio que quero entender é fazer o console reconhecer meu pontinho azul e o pontinho vermelho lembrando que tenho 10 segundos para fazer a jogada e as fases sao aleatorias.