» »

Skeniranje BMP ce vsebuje SubSliko

Skeniranje BMP ce vsebuje SubSliko

Vapo1 ::

torej... znam naloziti iz majhnega bmp-ja (ki je zelo majhen- majhna slikica) v "Mali_bitmap"... potem znam narediti Screenshot celega ekrana in ga dati v "Velik_bitmap"....

zanima me pa kako bi zdaj poskeniral celoten "Velik_bitmap" da bi preveril ce vsebuje "Mali_bitmap"


torej recimo da je "majhna slikica" slikica ikone od "recicle bin"... in ce bi bila "velika slika" screenshot Desktopa.. potem bi moralo javiti da vsebuje to majhno slikico recicle bina...

kakrsne koli ideje..

thanks

Binji ::

hmm.. ideja ki mi pade na pamet je, da bi iskal po pikslih v vrstici, dokler ne najdes piksla, ki po rgb ustreza levemu zgornjemu pikslu male slike. Potem gres preverjat ce ustreza tudi naprej. Ce ne, pac isces naprej.
Kdor ne navija ni Slovenc, hej, hej, hej!

MTm2H37rqt7B ::

Kolikor sem delal z OpenCV... ima funkcijo MatchTemplate, kar dela tocno to kar si ti omenil. Podas eno matriko kot template, eno matriko kot iskani zadevo, potem pa eno matriko kot rezultat.

Potem pa samo se isces maxium v rezultatu. Ta ti pa pove, koordinate maximuma in njegovo vrednost. Vbistvu zelo enostavno za sprogramirat.

netanyahu ::

Če je mala slika znotraj velike slike enake velikosti kot samostojna mala slike in če mala slika znotraj velike slike ni rotirana glede na samostojno malo sliko, potem križna korelacija med slikama.

Če je mala slika znotraj velike slike lahko rotirana, skalirana ali delno zakrita, potem algoritem SIFT.

fiction ::

Pomoje je brezveze komplicirati s Scale-Invariant Feature Transform-om.
Ceprav moram pa reci, da se kolikor sem to uporabljal na faksu za
razpoznavanje parkomatov na fotografijah super obnese.
Paziti je treba le na to, da imas vec kot 512 MB RAM-a (zadeva je kar
pomnilnisko pozresna).
Pri meni je trajalo za to, da sem pridobil keypointe (tocke,
ki so invariante glede na povecavo in delno tudi na kot posnetka)
skoraj 30 minut (swap).
Kasneje sem isto probal se z 1,5 GB RAM-a in je bilo prakticno
takoj.

Lahko samo premikas majhno sliko po vecji (po 1 piksel okrog) in gledas kje je korelacija najvecja
poleg tega pa nad nekim thresholdom.
Problem je le, da imas lahko za screenshot namizja razlicne resolucije.
Najlazje je, da imas potem vec razlicnih majhnih slik s katerimi isces
(ali pa pac eno vedno scalas na ravno pravo velikost). Fora je, da je
teh povecav itak samo ene par (in ne gre ravno za poljuben scale faktor).

MTm2H37rqt7B ::

Evo, progi z Intel OpenCV:

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <iostream>

int main( int argc, char** argv ) {

	char* imageName = "glavna.bmp"; 
	char* refName = "ref.bmp";

	IplImage* im = cvLoadImage(imageName, -1);
	IplImage* ref = cvLoadImage(refName, -1);
	
	IplImage* imG = cvCreateImage(cvSize(im->width, im->height), 8, 1);
	cvCvtColor(im, imG, CV_BGR2GRAY);
	IplImage* refG = cvCreateImage(cvSize(ref->width, ref->height), 8, 1);
	cvCvtColor(ref, refG, CV_BGR2GRAY);

	int resultWidth = imG->width - refG->width + 1;
	int resultHeight = imG->height - refG->height + 1;

	IplImage* result0 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);
	IplImage* result1 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);
	IplImage* result2 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);
	IplImage* result3 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);
	IplImage* result4 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);
	IplImage* result5 = cvCreateImage(cvSize(resultWidth, resultHeight), IPL_DEPTH_32F, 1);

	cvMatchTemplate(imG, refG, result0, CV_TM_SQDIFF);
	cvMatchTemplate(imG, refG, result1, CV_TM_SQDIFF_NORMED);
	cvMatchTemplate(imG, refG, result2, CV_TM_CCORR);
	cvMatchTemplate(imG, refG, result3, CV_TM_CCORR_NORMED);
	cvMatchTemplate(imG, refG, result4, CV_TM_CCOEFF);
	cvMatchTemplate(imG, refG, result5, CV_TM_CCOEFF_NORMED);

	double minVal = 5.0;
	double maxVal = NULL;
	CvPoint minLoc;
	CvPoint maxLoc;
		
	cvMinMaxLoc(result0, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("SQDIFF Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("SQDIFF Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);
	cvMinMaxLoc(result1, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("SQDIFFN Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("SQDIFFN Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);
	cvMinMaxLoc(result2, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("CCORR Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("CCORR Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);
	cvMinMaxLoc(result3, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("CCORRN Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("CCORRN Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);
	cvMinMaxLoc(result4, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("CCOEFF Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("CCOEFF Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);
	cvMinMaxLoc(result5, &minVal, &maxVal, &minLoc, &maxLoc, 0);
	printf("CCOEFFN Minimum location: X: %d, Y: %d\n",minLoc.x,minLoc.y);
	printf("CCOEFFN Maximum location: X: %d, Y: %d\n",maxLoc.x,maxLoc.y);



	cvNamedWindow("SQDIFF", 0 );
	cvNamedWindow("SQDIFF_NORMED",0);
	cvNamedWindow("CCORR",0);
	cvNamedWindow("CCORR_NORMED",0);
	cvNamedWindow("CCOEFF",0);
	cvNamedWindow("CCOEEFF_NORMED",0);

	cvShowImage("SQDIFF", result0);
	cvShowImage("SQDIFF_NORMED", result1);
	cvShowImage("CCORR", result2);
	cvShowImage("CCORR_NORMED", result3);
	cvShowImage("CCOEFF", result4);
	cvShowImage("CCOEEFF_NORMED", result5);

	cvNamedWindow("Image",0);
	cvNamedWindow("Template",0);
	cvShowImage("Image", imG);
	cvShowImage("Template", refG);

	
	cvWaitKey(0);
	cvReleaseImage(&imG);
	cvReleaseImage(&refG);
	cvReleaseImage(&result0);
	cvReleaseImage(&result1);
	cvReleaseImage(&result2);
	cvReleaseImage(&result3);
	cvReleaseImage(&result4);
	cvReleaseImage(&result5);
	cvDestroyAllWindows();
return 0;
}	


Kode je vec zato, ker prikazemo vec razlicnih nacinov primerjav (6 rezultatov). Za vsako tudi izpisemo kordinato maximuma.

Progi nam narise glavno in referencno slikico. Narise tudi vse rezultate, za prikaz se najlepse vidi normirane postopke (saj odtenka visjega od 255 monitor ne zna izristai).

Kaj rabis za to? Delal sem z Visual C++ Express 2007 in Intel OpenCV (je opensource). Navodila za implementirat OCV v VisalC++ so na uradni strani. OCV je zelo hitra zadeva.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Izdelava algoritma

Oddelek: Znanost in tehnologija
61539 (919) Klemen86
»

c napaka .c:4:1: error: expected identifier or '(' before '{' token

Oddelek: Programiranje
141928 (1501) MrStein
»

Začetniški problem pri klicanju funkcij

Oddelek: Programiranje
6955 (797) Vesoljc
»

"Problem" pri POSTanju ?

Oddelek: Slo-Tech
201736 (1304) Tody
»

Nec 3520a in regija

Oddelek: Strojna oprema
91142 (1043) Quikee

Več podobnih tem