|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2004
Città: Matrix.Digital.Pixel.World
Messaggi: 386
|
[c++/OpenCV] Head Position
Salve boys!
una domandina iniziale sul progetto che debbo realizzare di head position: " Il programma dato un fotogramma preso dalla webcam e grazie alla marcatura di appositi punti sull'immaine, deve essere in grado di restituire l'angolo di inclinazione del capo lungo X e Y ... quindi niente roll! " Detto ciò ekko il codice di base che ci è stato fornito. Contiene la piccola pecca che dopo il 1° fotogramma per rilevare lo spostamento impiega 2 fotogrammi! provate per credere ... in sostanza se faccio un fotogramma poi sposto la testa, il fotogramma successivo mi vedrà ancora nella posizione precedente che solo dp il secondo fotogramma si aggiornerà. Spero di essere stato chiaro xkè volevo sapere come fixare questo inconveniente! mi era venuto in mente di impostare il tutto con un do-while ... voi che ne dite? Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/cvaux.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
using namespace cv;
Mat myFrame; // matrice = immagine = screenshot webcam
void draw(int x,int y){
/* Questa funzione disegna un pallino rosso nel punto designato
* da un click eseguito dal tasto sinistro del mouse.
* myFrame: rappresenta lo screenshot eseguito tramite webcam del volto, essendo un'immagine
* è rappresentato come una matrice;
* Point: funzione che memorizza, al fine della visualizzazione, le coordinate in cui
* è stato deciso di disegnare un puntino;
* 1: indica il raggio;
* CV_RGB: indica il colore dell'oggetto disegnato;
* -1: valore di spessore, se positivo, lo spessore è esterno, altrimenti è interno
* e cioé di riempimento;
* CV_AA: Tipo di confine: Antialiased line;
* 0: Numero di bit frazionari nel punto di coordinate. */
circle(myFrame, Point(x,y), 1, CV_RGB(255,0,0), -1, CV_AA, 0);
//Get clean copy of image
imshow("Look", myFrame);
}
void onMouse( int event, int x, int y, int flags, void *param)
{
if(event==CV_EVENT_LBUTTONDOWN)
{
draw(x,y);
// quì vanno eseguiti i comandi atti a memorizzare la posizione (x,y).
}
}
int main (int, char **) {
VideoCapture cap(0); // accende la webcam
if(!cap.isOpened()) // fa un controllo se tutto è andato OK
return -1;
cap >> myFrame; /* salva il fotogramma prelevato dalla webcam nella nostra immagine/matrice
che fino a questo momento era rimasta non richiamata */
namedWindow("Look", 1); /* Crea una finestra di nome "Look" le cui dimensioni non sono
modificabili */
cvSetMouseCallback("Look", &onMouse, 0); /* Questa funzione assegna
un richiamo di funzione ogni volta
che nella finestra "Look" avviene
l'azione 0: il mouse si muove.
Per tale evento viene richiamata
la funzione onMouse. */
for (int c=1;c<300;c++) {
cap >> myFrame;
std::stringstream myString; // crea un char/string che conterrà un int
myString << c+1; // salva il numero di iterazione in questa nuova variabile
putText(myFrame, myString.str(), Point(100,100), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 3, 8, false);
/* Questa funzione posizione il numero di iterazione, che corrisponde al numero di frame salvati, in
* una determinata posizione della finestra colorandola di rosso, con un certo font ecc. */
imshow( "Look", myFrame); // mostra la finestra "Look" inserendovici l'immagine acquisita dalla webcam
waitKey(0); /* aspetta fintanto che non si preme un tasto dopodiché si procede
con la successiva iterazione del loop */
}
return 0;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:37.



















