Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21
  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ecco l'inizio del file:
    codice:
    #ifndef __ARTOOLKITPLUS_TRACKERSINGLEMARKERIMPL_HEADERFILE__
    #define __ARTOOLKITPLUS_TRACKERSINGLEMARKERIMPL_HEADERFILE__
    
    #pragma message ( "Compiling TrackerSingleMarkerImpl.h" )
    
    
    #include <ARToolKitPlus/TrackerSingleMarker.h>
    #include <ARToolKitPlus/TrackerImpl.h>
    #include <ARToolKitPlus/Logger.h>
    
    
    #define ARSM_TEMPL_FUNC template <int __PATTERN_SIZE_X, int __PATTERN_SIZE_Y, int __PATTERN_SAMPLE_NUM, int __MAX_LOAD_PATTERNS, int __MAX_IMAGE_PATTERNS>
    #define ARSM_TEMPL_TRACKER TrackerSingleMarkerImpl<__PATTERN_SIZE_X, __PATTERN_SIZE_Y, __PATTERN_SAMPLE_NUM, __MAX_LOAD_PATTERNS, __MAX_IMAGE_PATTERNS>
    
    
    namespace ARToolKitPlus
    {
    
    
    /// TrackerSingleMarkerImpl implements the TrackerSingleMarker interface
    /**
     *  __PATTERN_SIZE_X describes the pattern image width (16 by default).
     *  __PATTERN_SIZE_Y describes the pattern image height (16 by default).
     *  __PATTERN_SAMPLE_NUM describes the maximum resolution at which a pattern is sampled from the camera image
     *  (64 by default, must a a multiple of __PATTERN_SIZE_X and __PATTERN_SIZE_Y).
     *  __MAX_LOAD_PATTERNS describes the maximum number of pattern files that can be loaded.
     *  __MAX_IMAGE_PATTERNS describes the maximum number of patterns that can be analyzed in a camera image.
     *  Reduce __MAX_LOAD_PATTERNS and __MAX_IMAGE_PATTERNS to reduce memory footprint.
     */
    template <int __PATTERN_SIZE_X, int __PATTERN_SIZE_Y, int __PATTERN_SAMPLE_NUM, int __MAX_LOAD_PATTERNS=32, int __MAX_IMAGE_PATTERNS=32>
    class TrackerSingleMarkerImpl : public TrackerSingleMarker, protected TrackerImpl<__PATTERN_SIZE_X,__PATTERN_SIZE_Y, __PATTERN_SAMPLE_NUM, __MAX_LOAD_PATTERNS, __MAX_IMAGE_PATTERNS>
    {
    public:
    	TrackerSingleMarkerImpl(int nWidth=DEF_CAMWIDTH, int nHeight=DEF_CAMHEIGHT);
    	~TrackerSingleMarkerImpl();
    
    	/// initializes TrackerSingleMarker
    	/**
    	 *  nCamParamFile is the name of the camera parameter file
    	 *  nLogger is an instance which implements the ARToolKit::Logger interface
    	 */
    	virtual bool init(const char* nCamParamFile, ARFloat nNearClip, ARFloat nFarClip, ARToolKitPlus::Logger* nLogger=NULL);
    
    
    	/// adds a pattern to ARToolKit
    	/**
    	 *  pass the patterns filename
    	 */
    	virtual int addPattern(const char* nFileName);
    
    	/// calculates the transformation matrix
    	/**
    	 *	pass the image as RGBX (32-bits) in 320x240 pixels.
    	 *  if nPattern is not -1 then only this pattern is accepted
    	 *  otherwise any found pattern will be used.
    	 */
    	virtual int calc(const unsigned char* nImage, int nPattern=-1, bool nUpdateMatrix=true,
    			 ARMarkerInfo** nMarker_info=NULL, int* nNumMarkers=NULL);
    
    	/// Sets the width and height of the patterns.
    	virtual void setPatternWidth(ARFloat nWidth)  {  patt_width = nWidth;  }
    
    	/// Provides access to ARToolKit' patt_trans matrix
    	/**
    	*  This method is primarily for compatibility issues with code previously using
    	*  ARToolKit rather than ARToolKitPlus. patt_trans is the original transformation
    	*  matrix ARToolKit calculates rather than the OpenGL style version of this matrix
    	*  that can be retrieved via getModelViewMatrix().
    	*/
    	virtual void getARMatrix(ARFloat nMatrix[3][4]) const;
    
    	/// Returns the confidence value of the currently best detected marker.
    	virtual ARFloat getConfidence() const  {  return confidence;  }

  2. #12
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mi sta sorgendo un grosso dubbio dopo che ho scaricato i sorgenti.
    Ho visto che occorre compilarli per poterli usare.
    Tu come li hai compilati? Debug mode? Release mode? Con la CRT DLL o statica?
    Il tuo progetto come lo compili dopo aver incluso la libreria nel progetto? Debug mode? Release mode? Con la CRT DLL o statica?

    Perché quell'errore di linker può essere dovuto al fatto che stai mischiando librerie non compatibili.
    Intanto stai usando ARToolKitPlus o ARToolKitPlusDll?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #13
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie , intanto , sei sempre disponibile.
    Comunque:
    Ho linkato e compilato con i parametri giusti ,Multi-threaded Debug DLL (/MDd) e ho preso le dell dal progetto che le genera.
    Potrebbe anche essere che ho sbagliato qualcosa , ma credo che il problema sia dato da un doppio include, ovvero:
    posto il codice del presenter e del model:

    Presenter:
    codice:
    //.h
    #pragma once
    #include <vector>
    #include "wm4node.h"
    
    class DynamicTextures;
    class CModel;
    
    using namespace std;
    
    class CPresenter {
    	public:
    		CPresenter();
    		CPresenter(DynamicTextures*  pView);
    		~CPresenter();
    		bool InitCV();
    		bool GetTextureFromCam();
    		vector<double>* GetListInsertMarkers();
    		vector<double>* GetListDeleteMarkers();
    	private:
    		struct pimpl;
    		pimpl* pi;
                    CModel m_pModel ;
    };
    
    //.cpp
    #pragma once
    #include "Presenter.h"
    
    // Definizione della pimpl per CPresenter.
    struct CPresenter::pimpl {
    	pimpl() : pView(0), m_pModel(0) { ; }
    	~pimpl() { delete m_pModel; } 
    
    	DynamicTextures* pView;
    	CModel* m_pModel;	
    };
    
    
    CPresenter::CPresenter() : pi(new CPresenter::pimpl) { ; }
    
    CPresenter::CPresenter( DynamicTextures*  pView ) : pi(new CPresenter::pimpl)
    {
    	pi->pView = pView;
    	pi->m_pModel = new CModel();
    }
    
    CPresenter::~CPresenter(void)
    {
    }
    	
    bool CPresenter::InitCV()
    {
    	
    	return true;
    }	
    
    bool CPresenter::GetTextureFromCam()
    {
    	
    	return true;
    }
    
    vector<double>* CPresenter::GetListInsertMarkers()
    {
    
    	return NULL;
    }
    
    vector<double>* CPresenter::GetListDeleteMarkers()
    {
    
    	return NULL;
    }
    e del model :
    codice:
    //.h
    #pragma once
    
    #include <cv.h>
    #include <highgui.h>
    #include "ARToolKitPlus/TrackerSingleMarkerImpl.h"
    #include "ARToolKitPlus/ar.h"
    #include <stdio.h>
    #include <string.h>
    #include <glut.h>
    class CModel
    {
    public:
    	CModel(void){;};
    	~CModel(void){;};
    	//inizializzazione
    	bool Init();
    	bool InitModelReconizationMarker();
    private:
    	//oggetto per cattura video
    	CvCapture* m_pCapture;
    	ARToolKitPlus::TrackerSingleMarker* m_pTracker ;
    };
    //.cpp
    
    #pragma once
    #include "Model.h"
    
    bool CModel::Init()
    {	
    	m_pCapture = cvCreateCameraCapture(0);
    	assert(m_pCapture);
    	return true;
    }
    bool CModel::InitModelReconizationMarker()
    {
    	bool useBCH = true;
    	m_pTracker = new ARToolKitPlus::TrackerSingleMarkerImpl<6,6,6, 1,8>(320,240);
    	const char* description = m_pTracker->getDescription();
    
    	m_pTracker->setPixelFormat(ARToolKitPlus::PIXEL_FORMAT_LUM);
    	m_pTracker->setLoadUndistLUT(true);
    	if(!m_pTracker->init("quickcampro400.dat", 1.0f,1000.0f)) 
    	{
    		MessageBeep(200);
    	}
    	m_pTracker->setPatternWidth(80);
    	m_pTracker->setBorderWidth(useBCH ? 0.125f : 0.250f);
    	m_pTracker->activateAutoThreshold(true);
    	m_pTracker->setUndistortionMode(ARToolKitPlus::UNDIST_LUT);
    	m_pTracker->setMarkerMode(useBCH ?
    	ARToolKitPlus::MARKER_ID_BCH :ARToolKitPlus::MARKER_ID_SIMPLE);
    	
    	for(int i=0; i<16; i++)
    		printf("%.2f  %s", m_pTracker->getModelViewMatrix()[i],(i%4==3)?"\n  " : "");
    
    	return true;
    }

    il problema è che se includo nel presenter il model.h il linker mi da errori del tipo:

    1>Linking...
    1>Presenter.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in Model.obj
    1>Presenter.obj : error LNK2005: "public: virtual __thiscall ARToolKitPlus::CameraImpl::~CameraImpl(void)" (??1CameraImpl@ARToolKitPlus@@UAE@XZ) already defined in Model.obj
    1>Presenter.obj : error LNK2005: "public: virtual bool __thiscall ARToolKitPlus::CameraImpl::loadFromFile(char const *)" (?loadFromFile@CameraImpl@ARToolKitPlus@@UAE_NPBD@ Z) already defined in Model.obj
    1>Presenter.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraImpl:bserv2Ideal(float,float,float *,float *)" (?observ2Ideal@CameraImpl@ARToolKitPlus@@UAEXMMPAM 0@Z) already defined in Model.obj
    1>Presenter.obj : error LNK2005: "public: virtual void __thiscall ARToolKitPlus::CameraImpl::ideal2Observ(float,floa t,float *,float *)" (?ideal2Observ@CameraImpl@ARToolKitPlus@@UAEXMMPAM 0@Z) already defined in Model.obj


    invece se utilizzo la direttiva:
    class CModel;

    mi da un errore sul presenter.cpp , precisamente qui:
    codice:
    CPresenter::CPresenter( DynamicTextures*  pView ) : pi(new CPresenter::pimpl)
    {
    	pi->pView = pView;
    	pi->m_pModel = new CModel();/////////errrorre
    }
    e nella classe cPresenter se provo a dichiarare un oggetto membro m_pModel mi da il seguete errore:
    se tolgo il costruttore nel presenter compila tutto e funziona anche il link.

    Ho usato la class Cmodel nel presenter.h , perchè avevo bisogno di dichiarare il tipo m_pModel ma poi devo anche assegnarlo quel m_pModel e se includo il cmodel nel cpp chiaramente lo importo 2 volte ed ho gli errori del linker .
    Come si puo fare?
    grazie.

  4. #14
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Fai così.
    Apri il file "../src/CameraImpl.cxx" e cambia:
    codice:
    CameraImpl::CameraImpl()
    {}
    in
    codice:
    inline CameraImpl::CameraImpl()
    {}
    e vedi se questo errore:
    >Presenter.obj : error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in Model.obj
    sparisce.

    Ho idea che il pasticcio lo crei la libreria, non il tuo codice.
    Eventuali risposte, domani. Sennò mi addormento sulla tastiera.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #15
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    no , nessun errore , funziona tutto correttamente , togliendo il costruttore che ti ho detto , se invece lascio il costruttore :
    Error 2 error C2512: 'CModel' : no appropriate default constructor available c:\programmazione\wild magic 4\geometrictools\wildmagic4\samplegraphics\dynamic textures\presenter.cpp 19

    ciao e buona notte.

  6. #16
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    cavoli , hai ragione l'errore sparisce, scusa se non avevo compilato correttamente.
    ma questo cosa vuol dire?
    grazie a domani

  7. #17
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ma cosa vuol dire shodan?
    perchè se metto inline non mi da errore e se invece lo lascio cosi' si?
    e soprattutto , perchè se uso la libreria in un progetto stand alone funziona tutto e non mi da lo stesso problema?
    Adesso cosa dovei fare , mettere inline dove mi segnala gli errori ?
    perchè?
    grazie.

  8. #18
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Come immaginavo il problema è della libreria.
    Apri questo file:

    "ARToolKitPlus/TrackerSingleMarkerImpl.h"

    se noti, la penultima riga è:

    #include "../src/TrackerSingleMarkerImpl.cxx"

    che di fatto prende quel file e lo fa diventare un file header. Ora se nei file header è presente una funzione non definita nel corpo della classe, quella funzione dev'essere dichiarata inline. Finché il file viene usato solo in una unità di compilazione, il problema del linker non si presenta (trova solo un simbolo), se si usa in due o più unità di compliazione, il linker segnala errore.
    (Alcuni compilatori, es. Borland 5.5, non dicono nulla mentre VC++ protesta).

    Per fare le cose fatte bene, dovresti sfogliarti tutti i file che presentano una riga simile a quella li sopra e definire inline le varie funzioni. Onestamente la vedo una strada poco praticabile, anche perché se un giorno decidi di aggiornare la libreria avresti lo stesso problema (almeno finché qualcuno non farà notare agli autori questo problema).

    Un'altra strada potrebbe essere cercare nelle opzioni di linking qualcosa che dica al linker che tutto va bene anche se trova simboli doppi. Ma è una strada che non ho mai seguito e che, personalemente, non seguirò mai.

    La terza alternativa è quella di includere quel file in un solo file cpp, secondo questo schema.

    Nei file include, usi solo la classe virtuale (in questo caso TrackerSingleMarker) e nel file cpp (unico) avrai qualcosa del genere:

    codice:
    nel file cpp.
    
    #include "ARToolKitPlus/TrackerSingleMarkerImpl.h"
    #include "ARToolKitPlus/AltriFileImpl.h"
    
    #include "CModel.h"
    #include "Presenterh"
    #include "CQuelCheMiServeImpl.h"
     
    #include "CModelImpl.cxx"
    #include "PresenterImpl.cxx"
    #include "CQuelCheMiServeImpl.cxx"
    Il codice reale lo scriverai nei file cxx. In questo modo in fase di compilazione e linking, il compilatore riunirà i vari file in uno solo e il linker avra solo un simbolo delle varie funzioni inline.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #19
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusa , ma non capisco ,
    Ho creato il file .cpp che include tutto , cosi:

    codice:
    #include <cv.h>
    #include <highgui.h>
    
    #include "ARToolKitPlus/TrackerSingleMarkerImpl.h"
    #include "ARToolKitPlus/ar.h"
    
    #include "Model.h"
    #include "Presenter.h"
    //#include "DynamicTexturesCQuelCheMiServeImpl.h"
     
    #include "Model.cpp"
    #include "Presenter.cpp"
    //#include "CQuelCheMiServeImpl.cxx"
    e se compilo solo questo file funziona , solo se faccio la compilazione del progetto, tutti i file .cpp vengono compilati generando errori
    non capisco...

  10. #20
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ho escluso dalla compilazione i file .cpp e .h e sembra funzionare , è cosi che intendevi?
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.