Скажите почему я получаю разные цвета в Open cv?

171
16 августа 2017, 19:16

Я уже долго мучаюсь пытаясь найти фрагмент 1 картинки из другой которая получается через вывод из окна программы. Я вывел несколько пикселей картинки-где искать, картинки - шаблон для поиска и собственно картинки когда она открыта в ACDSee и последней цвета не совпадают, почему? Что я делаю не так? Вот код:

int main3()
{
    cv::Mat image= cv::imread("Image_0.bmp",1);
    cv::Mat3b im3b = image;
    cv::Mat imageR= cv::imread("boldt.jpg",1);
    cv::Mat3b im3bR = imageR;
    int wsi = image.cols;
    int hsi = image.rows;
    //может пригодиться
    //Пока так а потом координаты
    QList<QPoint*> pointsCoincidence;
    QMap<int, QMap<int, QPoint>> searchMatrix;
    QMap<int, QPoint> forSearchMatrix;
    QMap<int, QPoint> arrPassImg;
    QMap<int, uchar*> rowsSearchImg;
    int x_size = 800, y_size = 600; // <-- Your res for the image
    int height,width,srcheight,srcwidth;
    HWND hwnd = getHWND(titleWin);
    RECT windowsize;    // get the height and width of the screen
    GetClientRect(hwnd, &windowsize);
    y_size = windowsize.bottom;
    x_size = windowsize.right;
    height = windowsize.bottom/1;  //change this to whatever size you want to resize to
    width = windowsize.right/1;
    HBITMAP hBitmap; // <-- The image represented by hBitmap
    cv::Mat matBitmap; // <-- The image represented by mat
    // Initialize DCs
    HDC hdcSys = GetDC(hwnd); // Get DC of the target capture..
    HDC hdcMem = CreateCompatibleDC(hdcSys); // Create compatible DC
    void *ptrBitmapPixels; // <-- Pointer variable that will contain the potinter for the pixels
    // Create hBitmap with Pointer to the pixels of the Bitmap
    BITMAPINFO bi; HDC hdc;
    ZeroMemory(&bi, sizeof(BITMAPINFO));
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biWidth = x_size;
    bi.bmiHeader.biHeight = -y_size;  //negative so (0,0) is at top left
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 32;
    hdc = GetDC(hwnd);
    hBitmap = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &ptrBitmapPixels, NULL, 0);
    // ^^ The output: hBitmap & ptrBitmapPixels

    // Set hBitmap in the hdcMem
    SelectObject(hdcMem, hBitmap);
    // Set matBitmap to point to the pixels of the hBitmap
    matBitmap = cv::Mat(y_size, x_size, CV_8UC3, ptrBitmapPixels, 0);
    // Now update the pixels using BitBlt
    BitBlt(hdcMem, 0, 0, x_size, y_size, hdcSys, 0, 0, SRCCOPY);
    QString str = "";
    cv::Mat3b src=matBitmap;
    QPoint* luckyStart=0;
    bool coincidence = false;
    for(int p=0; p<4; p++) {
        cv::Vec3b pixel = im3b(0,p);
        int blueSi = pixel[0];
        int greenSi = pixel[1];
        int redSi = pixel[2];
        cv::Vec3b pixelR = im3bR(0,p);
        int blueSiR = pixelR[0];
        int greenSiR = pixelR[1];
        int redSiR = pixelR[2];
        /**/
        //for main matrix
        cv::Vec3b pixelMM = src(0, p);
        int blue = pixelMM[0];
        int green = pixelMM[1];
        int red = pixelMM[2];
        qDebug() <<"red="<<red <<"green" <<green <<"blue="<<blue;
        qDebug() <<"redSi="<<redSi <<"greenSi" <<greenSi <<"blueSi="<<blueSi;
        qDebug() <<"redSiR="<<redSi <<"greenSiR" <<greenSi <<"blueSiR="<<blueSi;
    }

Вот картинки:

Вот тут еще 1 (шаблон), извиняюсь ее наверно плохо видно + почему то закачался другого цвета, но факт в том что картинка на весь экран в программе имеет цвет первых пикселей отличный от просто загруженной картинки. Цвет шаблона совпадает если сравнивается на загруженной картинке, но если та в программе они не совпадают.

READ ALSO
Есть ли утечка памяти в коде

Есть ли утечка памяти в коде

Есть участок кода в программе:

181
Почему в С функции пишут под main()? [требует правки]

Почему в С функции пишут под main()? [требует правки]

В С функции пишут под main() и потом приходится выносить прототипы функцийХотя в Паскале, да и в С можно, писать над main() и прототипы не понадобятся

170