Не удалось найти ошибку в алгоритме поиска пикселей - PullRequest
0 голосов
/ 01 августа 2010

Хорошо, я пытаюсь создать программу, которая находит положение цветного пикселя на рабочем столе. Чтобы сделать это, я делаю скриншот рабочего стола, затем просматриваю пиксели и ищу тот, у которого есть соответствующий RGB, как мне нужно. Единственная проблема заключается в том, что моя программа возвращает странные координаты X, Y для найденного пикселя ...

#include <stdio.h>
#include <windows.h>
#include <atlimage.h>
#include <iostream>
using namespace std;
struct rgbcolor{
    int red;
    int green;
    int blue;} myColor;
struct point{
        int x;
        int y;
    };
point SearchPixel(int r,int g, int b){
    CImage bitmapzor;
    bitmapzor.Load(("C:\\1.bmp"));
    COLORREF PixColor=0; //This is a color data
    int R=0,G=0,B=0; //These are the channel values
    BYTE* byteptr = (BYTE*)bitmapzor.GetBits();
    int ok=0;
    int pitch = bitmapzor.GetPitch(); //This is a pointer offset to get new line of the bitmap
    //Go through every pixel and compare the RGB code
    for (int i=0; i<bitmapzor.GetWidth();i++)
        for (int j=0; j<bitmapzor.GetHeight();j++)
        {
            B= *(byteptr+pitch*j+3*i);
            G= *(byteptr+pitch*j+3*i+1);
            R= *(byteptr+pitch*j+3*i+2);       
            if(R==r&&G==g&&B==b)
            { point p;
              p.x=i;
              p.y=j;
              cout<<"First pixel found at:\n X:"<<p.x<<"\n Y:"<<p.y<<"\n-----------------\n";
              return p; 
            }
        }
    bitmapzor.Destroy(); //destroy the bitmap
    point p;
    p.x=-1;
    p.y=-1;
    cout<<"Pixel not found!\n";
    return p;

}

bool ScreenCapture(int x, int y, int width, int height, char *filename){
   // get a DC compat. w/ the screen
   HDC hDc = CreateCompatibleDC(0);    

   // make a bmp in memory to store the capture in
   HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);   

   // join em up
   SelectObject(hDc, hBmp);   

   // copy from the screen to my bitmap
    BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY); 
       CImage image;
        image.Attach(hBmp);
        image.Save(("C:\\1.bmp"), Gdiplus::ImageFormatBMP);
      SearchPixel(myColor.red,myColor.green,myColor.blue);

   // free the bitmap memory
   DeleteObject(hBmp);  

   return 1;
   }

int main()
{   //RGB for the searched color
    myColor.red=200;
    myColor.green=191;
    myColor.blue=231;

    int count=0;
    while(true){
        ScreenCapture(0, 0, 1366, 768, "c:\\1.bmp");
            count++;
        cout<<"Number of searches:"<<count<<"\n\n";
        Sleep(500);
    }
   system("pause");
   return 0;    
}

Ответы [ 3 ]

2 голосов
/ 01 августа 2010

Ну, этот код можно очень сильно упростить, но сначала я бы предложил вам попробовать гораздо более простой случай, например, найти известное целое число в массиве целых чисел small .Как только у вас будет эта работа, перейдите к более сложным случаям.

РЕДАКТИРОВАТЬ:
У вас достаточно знаний, чтобы сделать это?Кристи, пожалуйста, не пойми меня неправильно, но из всех программистов, с которыми мне приходилось иметь дело, худшими были те, кто думал, что им нечему учиться.На самом деле я не искал ошибку в вашем коде, потому что ваш код слишком сложен, и если бы вы пошли от простого к сложному при его создании, вы бы поймали свою ошибку намного раньше.

1 голос
/ 01 августа 2010

Я предлагаю вам распечатать значения RGB первых нескольких пикселей, чтобы убедиться, что вы даже правильно захватываете данные пикселей.Если ваши смещения неправильны, вы никогда не получите это работать.

0 голосов
/ 01 августа 2010

Хорошо, наконец-то я нашел ошибку, которая, как мне кажется, является причиной этой проблемы.

Арифметика указателя:

        B= *(byteptr+pitch*j+3*i);
        G= *(byteptr+pitch*j+3*i+1);
        R= *(byteptr+pitch*j+3*i+2);

Сделано для 24-битных изображений, но скриншот32-битное изображение, которое означает, что я должен изменить множитель на 4 вместо 3. Это означает:

    B= *(byteptr+pitch*j+4*i);
    G= *(byteptr+pitch*j+4*i+1);
    R= *(byteptr+pitch*j+4*i+2);

Я думаю ... Я вернусь с редактированием, если это работает или нет.

РЕДАКТИРОВАТЬ: Да это работает , это дает положение основного пикселя.Спасибо всем за помощь :).

...