"First, solve the problem.
Then, write the code."
John Johnson
Cpp/Qt

CamGuard

Symulacja opadającego piasku
mbCOMterminal
zamknięty:
czerwiec 2011
zleceniodawca:
projekt autorski
Opis:

CamGuard jest aplikacją monitorującą pomieszczenia. Wyskakujący komunikat informuje o ewentualnym wtargnięciu intruza.

Cały algorytm oparty jest na porównaniu dwóch zdjęć. Istnieje możliwość ustawienia tolerancji dla koloru czerwonego, zielonego, niebieskiego jak i dla całego obrazu. Dzięki temu ustawiając odpowiednie parametry możemy zabezpieczyć się przed zgłoszeniem alarmu w sytuacji, gdy np. słońce wyjdzie zza chmur ;). W tej pierwszej wersji projektu złożoność algorytmu wynosi n2. Oto funkcja porównująca dwa zdjęcia i zwracająca stosunek pikseli różnych do wszystkich:

 

double ImageComparer::compare(QImage *image1, QImage *image2) {
    int width1 = image1->width();
    int width2 = image2->width();
    int height1 = image1->height();
    int height2 = image2->height();

    int differentPixels = 0;
    int pixelCounter = 0;

    if( width1!=width2 || height1!=height2 ) {
        if( debug ) qDebug() << "ImageComparer :: Zdjęcia są różnej wielkości.";
        return 0;
    }

    for(int i=0; iscanLine(i);
        QRgb *line2 = (QRgb *)image2->scanLine(i);
        for(int z=0; z redColorTolerance ) {
                differentPixels++;
                continue;
            }

            if( abs(qGreen(*color1) - qGreen(*color2))/255. > greenColorTolerance ) {
                differentPixels++;
                continue;
            }

            if( abs(qBlue(*color1) - qBlue(*color2))/255. > blueColorTolerance ) {
                differentPixels++;
                continue;
            }
        }
    }

    if( debug ) {
        qDebug() << "ImageComparer :: Wszystkich: "+QString::number(pixelCounter)+", różnych: "+QString::number(differentPixels)+", stosunek: "+QString::number(differentPixels*1./pixelCounter);
    }
    return (differentPixels*1./pixelCounter);
}

 

do góry