Neautentificat.
/*
* Aceasta este una din metodele de comparare a doua imagini!Mai exact functia detecteaza diferentele dintre acestea!
* Metoda poate fi imbunatatita ajungandu`se chiar la detectarea miscarii in timpul rularii unui webcam
* sau al unui alt aparat de filmat ,comparandu`se imaginea curenta luata de la webcam cu ultima
*
*/
private static Bitmap Compare_Picture(Bitmap picOriginal, Bitmap picCompare)
{
int Inten = 5; // intensitatea scanarii(pentru a nu dura prea mult scanarea sugerez 5)
int Tolerance = 100; // toleranta reprezinta valoarea pe care o accepti ca eroare(erorile imaginii pot fi cauzate de aparatul slab cu care au fost facute pozele dar exista si alte motive)
Color OldColor = new Color(); // aceasta variabila va tine RGB`ul pentru picCompare la pixelul curent(i,j)
Color NewColor = new Color(); // aceasta variabila va tine RGB`ul pentru picCompare la pixelul curent(i,j)
bool[,] PSt = new bool[picOriginal.Width, picOriginal.Height]; // un array boolean care ne va zice starea pixelilor(true = pixelul a ramas acelasi / false = pixelul e diferit)
for (int i = 1; i < picOriginal.Width / Inten; i++)
{
for (int j = 1; j < picOriginal.Height / Inten; j++)
{
NewColor = picCompare.GetPixel(i * Inten, j * Inten); //luam RGB`ul pixelului curent(i,j) din imaginea originala
OldColor = picOriginal.GetPixel(i * Inten, j * Inten); //luam RGB`ul pixelului curent(i,j) din imaginea ce va fi comparata cu cea originala
/*
* Daca R1 - R2 < Tolerance(daca diferenta dintre valoarea culorii rosu din imaginea originala si cea din a 2a este mai mica decat "Tolerance"
* && si acelasi lucru pentru culoarea verde
* && si acelasi lucru pentru culoarea albastru
*/
if (Math.Abs((int)NewColor.R - (int)OldColor.R) < Tolerance && Math.Abs((int)NewColor.G - (int)OldColor.G) < Tolerance && Math.Abs((int)NewColor.B - (int)OldColor.B) < Tolerance)
{
// pixelul a ramas acelasi
PSt[i, j] = true;
}
/*
* daca nu atunci verificam daca exista miscare adevarata
* 1. i,j este diferit de cat cel din imaginea originala
* 2. i,j-1 este diferit de cat cel din imaginea originala
* 3. i,j+1 este diferit de cat cel din imaginea originala
* 4. i-1,j este diferit de cat cel din imaginea originala
* 5. i+1,j este diferit de cat cel din imaginea originala
*/
else
{
PSt[i, j] = false;
//setam pixelul rosu(adik exista miscare dar nu reala)
picCompare.SetPixel(i * Inten, j * Inten, Color.Red);
if (PSt[i, j] == false)
if (PSt[i, j + 1] == false)
if (PSt[i, j - 1] == false)
if (PSt[i + 1, j] == false)
if (PSt[i - 1, j] == false)// avem miscare reala
{
picCompare.SetPixel(i * Inten, j * Inten, Color.Green);
}
}
}
}
return picCompare; //returnam imaginea ce trebuie comparata dar cu modificari:)
}
Utilizare:
->Pe form avem nevoie de un buton si 2 PictureBox( picBox, picBoxCompare)
->Introduceti codul acesta pentru form
private void Form1_Load(object sender, EventArgs e)
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "");
bmp1 = new Bitmap(path + @"\1.JPG");
bmp2 = new Bitmap(path + @"\2.JPG");
picBox.Image = bmp1;
picBoxCompare.Image = bmp2;
}
private void button1_Click(object sender, EventArgs e)
{
picBoxCompare.Image = Compare_Picture(bmp1, bmp2);
}Have fun!AnDrEwBoY
Offline
