Ir ao conteúdo

Posts recomendados

Postado

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
Postado
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
  • 7 anos depois...
Postado

@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

 

  • mês depois...
Postado

@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  .

Postado

@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;
}

 

  • 3 meses depois...
Postado

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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!