[C/openCV] Problemi punti trovati da goodFeaturesToTrack()

Discussioni sul C/C++

[C/openCV] Problemi punti trovati da goodFeaturesToTrack()

Messaggiodi bisciasia il dom 28 feb 2010, 12:06

Ciao di nuovo :D è da due giorni che sto tentando di risolvere un problema ma non riesco a trovare la soluzione:
ho fatto un programmino che prende dei punti con cvGoodFeaturesToTrack(),
poi migliora la ricerca con cvFindCornersSubPix().
Quando vado a evidenziare i punti sull immagine pero , essi mi vengono fuori tutti in alto a sinistra. qualcuno ha qualche idea sul perche di questo fatto??

il codice:

int main (int argc, const char * argv[]) {

IplImage* img = cvLoadImage("mano.jpg",CV_LOAD_IMAGE_GRAYSCALE);
IplImage* eigImage=cvCreateImage(cvGetSize(img),32,1);
IplImage* tempImage=cvCreateImage(cvGetSize(img),32,1);
int corner_count=MAX_CORNERS;
CvPoint2D32f corners[MAX_CORNERS];

cvGoodFeaturesToTrack(img,eigImage,tempImage,corne rs,&corner_count,0.01,5,0,3,0,0.4);
cvFindCornerSubPix(img,corners,corner_count,cvSize (10,10),cvSize(-1,-1),cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS ,20,0.03));

for(int i=0;i<corner_count;i++){
CvPoint p=cvPoint(cvRound(corners[i].x+0.5),cvRound(corners[i].y+0.5));
cvLine(img,p,p,CV_RGB(255,255,255),2,2,2);
}

cvNamedWindow("example", 0);
cvShowImage("example", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("example");

return 0;
}

ho trovato dei problemi nell utilizzare cvSetReal2D ovvero mi da sempre errore quindi creo un punto con cvPoint e disegno una linea da quel punto a quel punto in modo da ottenere disegnato esattamente il punto di interese :D

grazie in anticipo
bisciasia
Novellino
 
Messaggi: 1
Iscritto il: dom 28 feb 2010, 12:03

Re: [C/openCV] Problemi punti trovati da goodFeaturesToTrack()

Messaggiodi Myzhar il dom 28 feb 2010, 20:30

Dunque... un po' di casino nel tuo codice :)

Ti dico subito una cosa visto che te l'ho causata io:
cvRound(corners[i].x+0.5)
è un "raddoppio" di codice, infatti cvRound fa esattamente quello che fa la chiamata
(int)(corners[i].x+0.5)
cioè approssima all'intero precedente se il decimale è minore di 0.5, al successivo se maggiore.
Quindi o scrivi cvRound(corners[i].x) o l'altra.

Per quanto riguarda i punti mi piacerebbe vedere uno screenshoot per capire l'errore che ti da.

Comunque invece di cvSetReal2D per disegnare i punti puoi usare anzi questo comando
(al posto di cvLine)
cvCircle( img, cvPoint((int)(corners[i].x+0.5),(int)(corners[i].y+0.5)), 3, RGB(255,255,0), 1 );
ti disegna dei cerchietti sui corner.
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa


Torna a Linguaggio C/C++

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti

cron