Ir ao conteúdo
  • Cadastre-se

Analisar a cor do pixel.


tnt355

Posts recomendados

Olá, sou novo em programação e preciso fazer um código.

O meu código precisa ficar analisando um ou mais pixeis específicos na tela.

Por exemplo: Tenho um vídeo rodando em fullscreen em 1920x1080 e quero monitorar a cor do pixel 1000x1000. Agora, supondo que esse pixel tenha sempre praticamente a mesma cor, mas aleatoriamente ele troque para outra cor distinta. Nesse caso eu precisaria que o código escrevesse que o pixel mudou de cor.

Tem como fazer isso em C++?

Poderiam me dar uma ideia de como fazer isso?

Obrigado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá, sou novo em programação e preciso fazer um código.

O meu código precisa ficar analisando um ou mais pixeis específicos na tela.

Por exemplo: Tenho um vídeo rodando em fullscreen em 1920x1080 e quero monitorar a cor do pixel 1000x1000. Agora, supondo que esse pixel tenha sempre praticamente a mesma cor, mas aleatoriamente ele troque para outra cor distinta. Nesse caso eu precisaria que o código escrevesse que o pixel mudou de cor.

Tem como fazer isso em C++?

Poderiam me dar uma ideia de como fazer isso?

Obrigado.

Acho que essa biblioteca ajuda.

http://opencv.willowgarage.com/wiki/

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 7 anos depois...

@Tiago Lima_709420     tem como pegar a cor do pixel no c / c++ usando a API do Windows , ainda estou estudando essa parte , mas tem esse código que funciona alguma coisa :

#include <iostream>                          /* biblioteca para entrada e saida               */
#include <windows.h>                         /* bibliteca para usar o windows                 */
#include <conio.h>
using namespace std;
int main(){
    int col,lin;                             /* coluna e linha da tela                        */
    POINT pt;                                /* para usar as coordenadas do mouse             */
    HDC hdc = GetDC(0);                      /* HDC é o buffer da tela Toda                   */
    COLORREF clrf;                           /* para trabalhar com cores                      */
    while ( ! GetAsyncKeyState( VK_ESCAPE )){/* A tecla ESC                                   */
        GetCursorPos(&pt                   );/* pega a posição do cursor                      */
        col   = pt.x;                        /* col recebe a posição x onde o cursor está     */
        lin   = pt.y;                        /* lin recebe a posição y onde o cursor está     */
        hdc   = GetDC(0                    );/* reseta o hdc                                  */
        clrf  = GetPixel(hdc,col,lin       );/* o valor int da cor nessa posção               */
        int r = GetRValue(clrf             );/* r recebe a quantidade de vermelho dessa pixel */
        int g = GetGValue(clrf             );/* g recebe a quantidade de verde    dessa pixel */
        int b = GetBValue(clrf             );/* b recebe a quantidade de azul     dessa pixel */
        cout<<"                    "  <<endl;
        cout<<"Cor ========> "<<clrf  <<endl;/* o valor total da cor                          */
        cout<<"valor de R => "<<r     <<endl;/* R vai de zero até 255                         */
        cout<<"valor de G => "<<g     <<endl;/* G vai de zero até 255                         */
        cout<<"valor de B => "<<b     <<endl;/* B vai de zero até 255                         */
        cout<<"                    "  <<endl;
        cout<<"Aponte A Setinha  e "        ;
        cout<<"Tecle Enter . . .  !"  <<endl;
        cout<<"Ou ESC Para Sair   !"  <<endl;
        getch();                             /* espera pressionar uma tecla e continua        */
    }
    cout<<"\n\n"<<endl;
    return 0;
}

para rodar esse código você precisa criar um novo projeto no codeblocks  escolhendo File/new/project/Win32 GUI project , e depois de colocar o nome do projeto clica em finalizar , aí na janela de projects clique no nome do projeto e em source e clique duas vezes no main.cpp e o código aparece do lado direito , então delete esse código que foi criado pelo codeblocks e cole esse código aí de cima , 

   mas se você puder fazer em outra linguagem , tem um código mais fácil de fazer isso usando o compilador Blitz Basic 3D  que usa a linguagem basic , fácil de aprender e o código para ele poderia ser assim  :

Graphics 600,400
SetBuffer BackBuffer()
SeedRnd(MilliSecs())
For h=1 To 30
  Cls
  For t = 1 To 1000
     Color Rnd(255), Rnd(255), Rnd(255)
    Rect Rnd(320),Rnd(200)+30,10,10,1
  Next
  ;  a cor é RGB 
  ;R é Vermelho e vai de zero até 255 
 ;G é Verde e vai de zero até 255
  ;B é Azul e vai de zero até 255
    ;para conseguir a Cor Amarela coloque   Color 255,255,0
  GetColor 100,100     ; pega a cor do pixel nessa posição
  r = ColorRed()          ; identifica a quantidade de cor vermelha no pixel que vai de zero até 255
  g = ColorGreen()      ; identifica a quantidade de cor verde no pixel que vai de zero até 255
  b = ColorBlue          ; identifica a quantidade de cor azul no pixel que vai de zero até 255
 
 For f=400 To 450
  For  n=100 To 150
    Plot f,n
  Next 
Next
  Color 0,200,20
  Text 0,0, "A Caixa Em 100 x 100 É RGB -> "+r+" , "+g+" , "+b+" !"
  Text 380,60,"O Pixel Nessa Posição "
  Text 380,80,"Tem Essa Cor Aqui"
     ;Print "Box at 100,100 is RGB:" + ColorRed() + "," + ColorGreen() + "," + ColorBlue() + "!"
    Flip 
  Delay 500
  Next
  Text 10,370 ,"Pronto  Tecle ESC"
  Flip
  While Not KeyHit(1)
Wend
End

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...

@Tiago Lima_709420      no dev c++ você pode rodar esse código de cima do mesmo jeito que no codeblocks , mas para isso  você precisa criar um projeto do tipo windows application e fazer o mesmo procedimento de deletar o código criado e colar esse código ai de cima , no blitz 3D só pega a cor do pixel na tela da aplicação  .

Link para o comentário
Compartilhar em outros sites

@Tiago Lima_709420     usando a API do windows você consegue pegar a cor da tela do windows ,  então no dev c++ você cria um projeto do tipo windows application , clicando em arquivo / novo / projeto / windows application e coloque o nome e clique em ok ,   do lado esquerdo da tela em cima clique em projeto / surce / e dois clique no main  ,  então delete esse código criado e copie e cole esse código abaixo no lugar e salve ele e pode compilar o RGB informa o valor da cor na posição da setinha do mouse onde apontar o R e o G e o B varia de zero até 255 dependendo da cor daquela posição    .

#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>
#include <math.h>
#include <iostream>                          /* biblioteca para entrada e saida               */
#include <conio.h>
struct u{
    char N[8];
};
struct u h;
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");
static int i;
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) 5/*COLOR_BACKGROUND*/;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Code::Blocks Template Windows App , um triangulo "), /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           1024,                 /* The programs width */
           600,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
struct u itoa(int r, int a){
    struct u h;
    if     (a==1)h.N[0]='R';/* está sendo usado para substituir a função itoa */
    else if(a==2)h.N[0]='G';/* está sendo usado para substituir a função itoa */
    else if(a==3)h.N[0]='B';/* está sendo usado para substituir a função itoa */
    h.N[1]=' ';
    h.N[2]='=';
    h.N[3]=' ';
    h.N[4]=r/100   +48;/* centenas */
    h.N[5]=r%100/10+48;/* dezenas  */
    h.N[6]=r%100%10+48;/* unidades */
    h.N[7]='\0';       /* sinaliza o final da string */
    return h;
}

/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC tela ;
    POINT pt;
    COLORREF clrf;
    static TCHAR frase[] = _T("Tecle ESC Para Sair !");
    PAINTSTRUCT ps ;
    int j,r,g,b;
    tela = GetDC (hwnd) ;
    switch (message)            /* handle the messages */
    {
        case WM_KEYDOWN:        //  se pressionar a tecla ESC
            if (wParam == VK_ESCAPE)
                PostQuitMessage (0) ;
        case WM_PAINT :
            GetCursorPos(&pt);
            tela = GetDC(0);    /* precisa para pegar a cor */
            clrf=GetPixel(tela,pt.x,pt.y);/* pega a cor total dessa posição da setinha do mouse */

            r=GetRValue(clrf);
            g=GetGValue(clrf);
            b=GetBValue(clrf);
            struct u R ;/* usando struct para retornar um vetor de char */
            R = itoa(r,1);
            struct u G ;
            G = itoa(g,2);
            struct u B ;
            B = itoa(b,3);

            tela = BeginPaint (hwnd, &ps) ;
            TextOut (tela, 650, 50, frase, _tcslen(frase));// escreve mensagem na tela
            TextOut(tela, 500, 50, R.N, _tcslen(R.N));
            TextOut(tela, 500, 65, G.N, _tcslen(G.N));
            TextOut(tela, 500, 80, B.N, _tcslen(B.N));

            MoveToEx(tela,  static_cast<int>(sin(i*3.141615/180)*100+700),
                            static_cast<int>(cos(i*3.141615/180)*100+250),NULL) ;//posição de inicio do triangulo
            for(j=1;j<4;j++)
                LineTo(tela,static_cast<int>(sin((i+ j*120+00)*3.141615/180)*100+700) ,
                            static_cast<int>(cos((i+ j*120+00)*3.141615/180)*100+250));//vai para essas posições
            i++;
            if(i>360)i=0;
            Sleep(50);
            InvalidateRect (hwnd, NULL, TRUE) ;//limpa a tela
            EndPaint (hwnd, &ps) ;
            return 0 ;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    getch();
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

A dica do Devair1010 funcionou perfeitamente aqui. Como eu queria em C, fiz a conversão.

 

#include <stdio.h>                          /* biblioteca para entrada e saida               */
#include <windows.h>                         /* bibliteca para usar o windows                 */
#include <stdlib.h>
int main(){
    int col,lin;                             /* coluna e linha da tela                        */
    POINT pt;                                /* para usar as coordenadas do mouse             */
    HDC hdc = GetDC(0);                      /* HDC é o buffer da tela Toda                   */
    COLORREF clrf;                           /* para trabalhar com cores                      */
    while ( ! GetAsyncKeyState( VK_ESCAPE )){/* A tecla ESC                                   */
        GetCursorPos(&pt);                   /* pega a posição do cursor                      */
        col   = pt.x;                        /* col recebe a posição x onde o cursor está     */
        lin   = pt.y;                        /* lin recebe a posição y onde o cursor está     */
        hdc   = GetDC(0);                    /* reseta o hdc                                  */
        clrf  = GetPixel(hdc,col,lin);       /* o valor int da cor nessa posção               */
        int r = GetRValue(clrf);             /* r recebe a quantidade de vermelho dessa pixel */
        int g = GetGValue(clrf);             /* g recebe a quantidade de verde    dessa pixel */
        int b = GetBValue(clrf);             /* b recebe a quantidade de azul     dessa pixel */
        printf("                    \n");
        printf("Cor ========> \n");            /* o valor total da cor                          */
        printf("valor de R => %i\n", r);       /* R vai de zero até 255                         */
        printf("valor de G => %i\n", g);       /* G vai de zero até 255                         */
        printf("valor de B => %i\n", b);       /* B vai de zero até 255                         */
        printf("                    ");
        printf("Aponte A Setinha  e tecle Enter\n");
        printf("Ou ESC Para Sair   !");
        getch();                             /* espera pressionar uma tecla e continua        */
    }
    printf("\n\n");
    return 0;
}

Lembrando que tem que linkar a biblioteca GDI. Para isso, vá nas opções do compilador e adicione -lgdi32 na guia Linker Settings. Testei com o CodeBlocks e funcionou de boa.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!