View Full Version : PROBLEMA CON DOPPIO PUNTATORE
fulviettino
08-04-2004, 13:32
Ciao a tutti,
non riesco a far funzionare un metodo.
Il problema è il tipo del parametro che gli passo; per spiegarmi meglio scrivo due righe di codice.
TipoDerivato* X;
Metodo(TipoDerivato** X);
Nella prima riga viene definita la variabile X (come puntatore di tipo "Tipoderivato"); la seconda riga corrisponde ad un metodo che come parametro ha bisogno di un "Tipoderivato**".
Chiamando il metodo così:
Metodo(&X);
non funziona...qualcuno saprebbe illuminarmi?
Thankss
ilsensine
08-04-2004, 14:20
Se X non è un puntatore, &X è un semplice puntatore all'oggetto. Il problema lo puoi aggirare così:
TipoDerivato* pX = &X;
Metodo(&pX);
Tecnicamente è corretto, ma dovresti controllare cosa ci fa il metodo con un puntatore a un puntatore, e perché non gli basta un puntatore normale -- potrebbe non essere quello che ti aspetti.
fulviettino
08-04-2004, 14:27
Mi da un errore di conversione:
Cannot convert 'Tipoderivato**' to 'Tipoderivato*'
:muro:
ilsensine
08-04-2004, 14:35
Ah sì avevo letto male, X è di tipo "TipoDerivato *".
Il tuo codice dovrebbe funizonare, a meno che X non è qualcosa di strano (tipo "this"). Che errore ti viene dato?
fulviettino
08-04-2004, 14:43
Originariamente inviato da ilsensine
Ah sì avevo letto male, X è di tipo "TipoDerivato *".
Il tuo codice dovrebbe funizonare, a meno che X non è qualcosa di strano (tipo "this"). Che errore ti viene dato?
uaz! non riesco proprio a definirti l'errore perchè sto utilizzando delle DLL e mi viene lanciato un errore specifico da queste.
Unrecognized or unsupported array type
Bad flag (parameter or structure field)
(status:-206)
ErrMode=CV_ErrorModeLeaf
non penso dica molto...
ilsensine
08-04-2004, 14:47
Ah boh formalmente il codice è corretto, non ho idea di come vengano gestite in una dll queste cose. L'errore è di compilazione o di runtime? Stai forse lavorando su diavolerie quali com e activex?
fulviettino
08-04-2004, 15:06
Originariamente inviato da ilsensine
Ah boh formalmente il codice è corretto, non ho idea di come vengano gestite in una dll queste cose. L'errore è di compilazione o di runtime? Stai forse lavorando su diavolerie quali com e activex?
...runtime...sto maledetto...
Sto lavorando con librerie opencv per comunicare con webcam...vedo se ci sono altre vie per fare ciò che devo:mc: :mc: :mc: :mc:
ciao ciao grazie lo stesso!
ilsensine
08-04-2004, 15:14
Se devi acquisire, puoi usare DirectX o v4w. Non è il mio campo, però.
fulviettino
08-04-2004, 18:24
grazie per il consiglio, terrò presente. Ora però mi servono quelle librerie perchè oltre all'acquisizione mi permettono anche di elaborare l'immagine :)
ciauuu
Hai provato cosi':
TipoDerivato** X;
Metodo(TipoDerivato** X);
poi chiami il metodo cosi':
Metodo(X);
ciao, ho visto che fai elaborazioni su immagini e utilizzi le librerie intel Open CV...immagino che fai Ingegneria Informatica a Milano...vero?
Io ho appena finito la Tesina per Elaborazioni d'immagini presso ing. di Modena, se hai bisogno fammi un fischio....
;)
Ciao...........
fulviettino
08-04-2004, 22:12
Originariamente inviato da Bedo
Hai provato cosi':
TipoDerivato** X;
Metodo(TipoDerivato** X);
poi chiami il metodo cosi':
Metodo(X);
ciao, ho visto che fai elaborazioni su immagini e utilizzi le librerie intel Open CV...immagino che fai Ingegneria Informatica a Milano...vero?
Io ho appena finito la Tesina per Elaborazioni d'immagini presso ing. di Modena, se hai bisogno fammi un fischio....
;)
Ciao...........
C'hai preso in pieno :) Ingegneria informatica al Poli di Mi :)
Conosci le Open CV?
Beh allora mi sa che ti assillerò un pò ;)
Domani mattina provo a chiamare la funzione come mi hai suggerito, poi se non riesco a risolvere alcuni problemi te li presento molto volentieri!
Bene sono contento di non essere l'unico malato che usa e/o conosce queste librerie! Fin'ora avevo solo trovato un forum su yahoo, proprio delle opencv ma nessuno mi calcolava!:mc: :mc: :mc:
Domani mi faccio risentire su questi schermi!
Ciauuu
Ciao,
le librerie Open CV non le ho mai usate:cry: ...conosco solo l'esistenza, ad Ing. Info a Modena utilizziamo le librerie VFW32...la decodifica dei video viene fatta tutta in SW. Le librerie Open CV, se non ricordo male, utilizzano le istruzioni SSE e SSE2 del Pentium IV e M...mi piacerebbe un tot impararle ad usare.
Comunque per farti un'idea di cosa facciamo a Modena, ti racconto la mia tesina che ho realizzato con altri due compagni di corso:
Oggetto: Realizzare un Traffic Surveillance : cioe' contare gli oggetti in movimento in un video stradale e poi classificarli in Persone, Auto, Camion.
Tecniche usate : Selective background, Labeling, Stampa delle Bounding Box e baricentro degli oggetti, Tracking, Classificatore statistico...Rete neurale non avevamo voglia...
A Milano cosa fate?
Teniamoci in contatto...ciao
fulviettino
09-04-2004, 08:47
Originariamente inviato da Bedo
[CUT]
TipoDerivato** X;
Metodo(TipoDerivato** X);
poi chiami il metodo cosi':
Metodo(X);
[CUT]
Niente...mi da un errore di conversione.
In effetti ora noto una cosa: la chiamata Metodo(&X) funziona solo che il problema sta alla fine del programma;
In sostanza, devo acquisire un frame da una webcam e quel "Metodo" (cvReleaseCapture) servirebbe per spegnere la telecamera. Questa si spegne ma il programma lancia un errore...probabilmente non dealloco le variabili che ho precedentemente allocato...
Queste sono le operazioni che faccio:
CvCapture* capture;//puntatore al frame acquisito dalla webcam
IplImage* GotImage;//immagine del frame catturato
capture = cvCaptureFromCAM(-1);//alloca e inizializza la stuttura CvCapture per leggere dalla webcam
GotImage = cvQueryFrame(capture);//cattura un frame dalla cam e restituisce un pointer all'immagine catturata
cvReleaseCapture( &capture );//spegne la webcam
senza usare il cvreleasecapture, chiudendo il programma, questo rimane in esecuzione
usando il cvreleasecapture quando chiudo visualizzo un errore
fulviettino
09-04-2004, 08:50
Ecco!
Usavo il releasecapture troppo presto! dato che visualizzo l'immagine catturata in una finestra dovevo chiamarlo dopo la chiusura di questa!
OK :D :D :D :D :D
Ora il problema sarà la vettorializzazione dell'immagine...pensi sia difficile passare da bmp a dxf o hpgl? Oppure, ancora meglio, da bmp a codici ISO?
CvCapture* capture;//puntatore al frame acquisito dalla webcam
IplImage* GotImage;//immagine del frame catturato
capture = cvCaptureFromCAM(-1);//alloca e inizializza la stuttura CvCapture per leggere dalla webcam
GotImage = cvQueryFrame(capture);//cattura un frame dalla cam e restituisce un pointer all'immagine catturata
Se GotImage e' un puntatotore all'imagine BMP del frame acquisito da WebCam e' impossibile che non esistano metodi che permettono di leggere la dimensione x e y dell' immagine(se no dovresti usare il BITMAPINFOHEADER) e poi puoi creare alcuni metodi tipo :
// lettura di un punto dell'immagine
PointInfo& GetPoint(int x, int y) {return m_pPixMap[x+y*m_iWidth];}
// lettura di un punto dell'immagine
PointInfo& GetPoint(int i) { return m_pPixMap[i];}
// settaggio del valore di un punto
bool SetPoint(int x, int y, PointInfo Value){
m_pPixMap[x+y*m_iWidth]=Value;
return TRUE;
}
// settaggio del valore di un punto
bool SetPoint(int i, PointInfo Value){
m_pPixMap[i]=Value;
return TRUE;
}
// lettura del puntatore alla pixmap interna
PointInfo *GetPixMap() { return m_pPixMap;}
Dove m_iWidth e m_Height sono le dimensioni dell'immagine BMP...
ciao
fulviettino
09-04-2004, 15:05
// lettura di un punto dell'immagine
PointInfo& GetPoint(int x, int y) {return m_pPixMap[x+y*m_iWidth];}
scusa ma non capisco il PointInfo& e il m_pPixMap... se poi devo creare un dxf o un hpgl a cosa mi servono?
Ma cosa devi comandare un plotter, una stampante?
Spiegami cosa sono a modo questi formati?
Pensavo che dovessi elaborare immagini?:confused:
fulviettino
10-04-2004, 09:35
Originariamente inviato da Bedo
Ma cosa devi comandare un plotter, una stampante?
Spiegami cosa sono a modo questi formati?
Pensavo che dovessi elaborare immagini?:confused:
Si, acquisita una immagine, la devo rendere in due colori (con un'operazione di Threshold) per poi applicare cvFindContour ed estrarre i contorni dalla suddetta immagine. Il mio problema è che ora mi servirebbero le coordinate dei pixel del contorno rilevato;
La cvFindContours è definita come segue (incollo la parte della documentazione):
FindContours
Finds contours in binary image
int cvFindContours( CvArr* img, CvMemStorage* storage, CvSeq** firstContour, int headerSize=sizeof(CvContour), CvContourRetrievalMode mode=CV_RETR_LIST, CvChainApproxMethod method=CV_CHAIN_APPROX_SIMPLE );
img
The source 8-bit single channel image. Non-zero pixels are treated as 1's, zero pixels remain 0's - that is image treated as binary. To get such a binary image from grayscale, one may use cvThreshold, cvAdaptiveThreshold or cvCanny. The function modifies the source image content.
storage
Container of the retrieved contours.
firstContour
Output parameter, will contain the pointer to the first outer contour.
headerSize
Size of the sequence header, >=sizeof(CvChain) if method=CV_CHAIN_CODE, and >=sizeof(CvContour) otherwise.
mode
Retrieval mode.
CV_RETR_EXTERNALretrives only the extreme outer contours
CV_RETR_LISTretrieves all the contours and puts them in the list
CV_RETR_CCOMPretrieves all the contours and organizes them into two-level hierarchy: top level are external boundaries of the components, second level are bounda boundaries of the holes
CV_RETR_TREEretrieves all the contours and reconstructs the full hierarchy of nested contours
method
Approximation method.
CV_CHAIN_CODEoutputs contours in the Freeman chain code. All other methods output polygons (sequences of vertices).
CV_CHAIN_APPROX_NONEtranslates all the points from the chain code into points;
CV_CHAIN_APPROX_SIMPLEcompresses horizontal, vertical, and diagonal segments, that is, the function leaves only their ending points;
CV_CHAIN_APPROX_TC89_L1,
CV_CHAIN_APPROX_TC89_KCOS applies one of the flavors of Teh-Chin chain approximation algorithm.
CV_LINK_RUNS uses completely different (from the previous methods) algorithm - linking of horizontal segments of 1's. Only CV_RETR_LIST retrieval mode is allowed by the method.
The function cvFindContours retrieves contours from the binary image and returns the number of retrieved contours. The pointer firstContour is filled by the function. It will contain pointer to the first most outer contour or NULL if no contours is detected (if the image is completely black). Other contours may be reached from firstContour using h_next and v_next links. The sample in cvDrawContours discussion shows how to use contours for connected component detection.
Nella variabile CvMemStorage* storage ci sono i contorni ma non riesco ad ottenere i pixel. La stuttura che di storage è definita così:
typedef struct CvMemStorage
{
struct CvMemBlock* bottom;/* first allocated block */
struct CvMemBlock* top; /* the current memory block - top of the stack */
struct CvMemStorage* parent; /* borrows new blocks from */
int block_size; /* block size */
int free_space; /* free space in the top block (in bytes) */
} CvMemStorage;
Mi sto leggendo bene tutta la documentazione, e sto cercando alcuni esempi, te lo chiedevo nel caso tu avessi già affrontato un problema simile.
Ciaoo
fulviettino
13-04-2004, 11:04
niente...a te non è capitato di avere lo stesso problema?
Ciao,
scusa per il ritardo....:p
Ho visto che hai postato "l'universo"......
Fossi in te implementerei un Sobel, al max un Canny... automaticamente hai i punti di edge che desideri.
Se vuoi che ti aiuta, mandami i sorgenti, le intel open Cv ci penso io a scaricarle....ciao
fulviettino
13-04-2004, 14:20
Figurati per il ritardo nessun prob!
Se ti può interessare ho risolto con la "cvGetSeqElem" facendo un ciclo per trovare tutti i contorni presenti nell'immagine e un altro ciclo interno per scandire tutti i pixel del singolo contorno.
Ora mi acquisisce tutte le coordinate dei pixel!!!:D :D :D :D
fulviettino
13-04-2004, 14:22
Originariamente inviato da Bedo
Se vuoi che ti aiuta, mandami i sorgenti, le intel open Cv ci penso io a scaricarle....ciao
Grazie mille per ora i ho risolto e sono troppo contento
:D :D :D :D :D :D :D
Ciaooo
fulviettino
13-04-2004, 14:28
Originariamente inviato da Bedo
Ciao,
le librerie Open CV non le ho mai usate:cry: ...conosco solo l'esistenza, ad Ing. Info a Modena utilizziamo le librerie VFW32...la decodifica dei video viene fatta tutta in SW. Le librerie Open CV, se non ricordo male, utilizzano le istruzioni SSE e SSE2 del Pentium IV e M...mi piacerebbe un tot impararle ad usare.
Comunque per farti un'idea di cosa facciamo a Modena, ti racconto la mia tesina che ho realizzato con altri due compagni di corso:
Oggetto: Realizzare un Traffic Surveillance : cioe' contare gli oggetti in movimento in un video stradale e poi classificarli in Persone, Auto, Camion.
Tecniche usate : Selective background, Labeling, Stampa delle Bounding Box e baricentro degli oggetti, Tracking, Classificatore statistico...Rete neurale non avevamo voglia...
A Milano cosa fate?
Teniamoci in contatto...ciao
Caspita questo post non lo avevo letto! Sorry!
Molto interessante la tua tesina!
Io ora sto lavorando ad una macchina che dovrebbe rilevare la forma di un oggetto e poi intagliare nel polistirolo una sagoma che faccia da involucro per l'oggetto. "Purtroppo" oltre alla pura parte software c'è una bella parte hardware per il controllo numerico che governa la macchina e anche per il controllo della temperatura del filo utile a tagliare il polistirolo.
Tornando alle Opencv, so di una persona che usandole ha presentato la tesi quasi come nel film "Minoroty Report", spostando le icone del desktop (proiettate a muro) con le mani
:eek: :eek: :eek:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.