50 #include <visp/vpConfig.h>
55 #if defined(VISP_HAVE_X11) && ! defined(APPLE)
60 # include <visp/vpDisplayX.h>
62 #include <visp/vpDisplayGTK.h>
63 #include <visp/vpDisplayGDI.h>
64 #include <visp/vpDisplayOpenCV.h>
65 #include <visp/vpPose.h>
66 #include <visp/vpPoint.h>
67 #include <visp/vpImagePoint.h>
68 #include <visp/vpDot2.h>
69 #include <visp/vpPixelMeterConversion.h>
70 #include <visp/vpVideoReader.h>
71 #include <visp/vpParseArgv.h>
72 #include <visp/vpIoTools.h>
73 #include <visp/vpDebug.h>
74 #include <visp/vpAROgre.h>
77 #define GETOPTARGS "ci:p:h"
90 void usage(
const char *name,
const char *badparam, std::string ipath, std::string ppath)
93 Test augmented reality using the vpAROgre class.\n\
96 %s [-i <test image path>] [-p <personal image path>]\n\
101 -i <input image path> %s\n\
102 Set image input path.\n\
103 From this path read images \n\
104 \"ViSP-images/mire-2/image.%%04d.pgm\". These \n\
105 images come from ViSP-images-x.y.z.tar.gz available \n\
106 on the ViSP website.\n\
107 Setting the VISP_INPUT_IMAGE_PATH environment\n\
108 variable produces the same behaviour than using\n\
111 -p <personal image path> %s\n\
112 Specify a personal sequence containing images \n\
114 By image sequence, we mean one file per image.\n\
115 The following image file formats PNM (PGM P5, PPM P6)\n\
116 are supported. The format is selected by analysing \n\
117 the filename extension.\n\
118 Example : \"/Temp/ViSP-images/cube/image.%%04d.pgm\"\n\
119 %%04d is for the image numbering.\n\
122 Disable the mouse click. Useful to automaze the \n\
123 execution of this program without humain intervention.\n\
127 ipath.c_str(), ppath.c_str());
130 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
145 bool getOptions(
int argc,
const char **argv, std::string &ipath,
146 std::string &ppath,
bool &click_allowed)
153 case 'c': click_allowed =
false;
break;
154 case 'i': ipath = optarg;
break;
155 case 'p': ppath = optarg;
break;
156 case 'h': usage(argv[0], NULL, ipath, ppath);
160 usage(argv[0], optarg, ipath, ppath);
165 if ((c == 1) || (c == -1)) {
167 usage(argv[0], NULL, ipath, ppath);
168 std::cerr <<
"ERROR: " << std::endl;
169 std::cerr <<
" Bad argument " << optarg << std::endl << std::endl;
177 #ifndef DOXYGEN_SHOULD_SKIP_THIS
179 class vpAROgreExample :
public vpAROgre
184 unsigned int width = 640,
unsigned int height = 480,
185 const char *resourcePath=NULL)
188 if (resourcePath) mResourcePath = resourcePath;
189 std::cout <<
"mResourcePath: " << mResourcePath<< std::endl;
190 vecDevant = Ogre::Vector3(0,-1,0);
197 Ogre::Vector3 vecDevant;
199 Ogre::AnimationState * mAnimationState;
207 mSceneMgr->setAmbientLight(Ogre::ColourValue((
float)0.6,(
float)0.6,(
float)0.6));
208 Ogre::Light * light = mSceneMgr->createLight();
209 light->setDiffuseColour(1.0,1.0,1.0);
210 light->setSpecularColour(1.0,1.0,1.0);
212 light->setPosition(-5, -5, 10);
213 light->setType(Ogre::Light::LT_POINT);
214 light->setAttenuation((Ogre::Real)100, (Ogre::Real)1.0, (Ogre::Real)0.045, (Ogre::Real)0.0075);
216 light->setCastShadows(
true);
219 robot = mSceneMgr->createEntity(
"Robot",
"robot.mesh");
221 Ogre::SceneNode* RobotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(
"Robot");
222 RobotNode->attachObject(robot);
223 RobotNode->scale((Ogre::Real)0.001,(Ogre::Real)0.001,(Ogre::Real)0.001);
224 RobotNode->pitch(Ogre::Degree(90));
225 RobotNode->yaw(Ogre::Degree(-90));
226 robot->setCastShadows(
true);
227 mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_MODULATIVE);
231 mAnimationState = robot->getAnimationState(
"Idle" );
233 mAnimationState->setLoop(
true );
235 mAnimationState->setEnabled(
true );
240 plan.normal = Ogre::Vector3::UNIT_Z;
241 Ogre::MeshManager::getSingleton().createPlane(
"sol",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plan, (Ogre::Real)0.22, (Ogre::Real)0.16, 10, 10,
true, 1, 1, 1);
242 Ogre::Entity* ent = mSceneMgr->createEntity(
"Entitesol",
"sol");
243 Ogre::SceneNode* PlaneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(
"Entitesol");
244 PlaneNode->attachObject(ent);
245 ent->setMaterialName(
"Examples/GrassFloor");
251 mAnimationState->addTime( evt.timeSinceLastFrame );
257 mKeyboard->capture();
259 double angle = -M_PI/8;
260 if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
266 if(mKeyboard->isKeyDown(OIS::KC_Z) || mKeyboard->isKeyDown(OIS::KC_UP)){
267 mSceneMgr->getSceneNode(
"Robot")->setPosition(mSceneMgr->getSceneNode(
"Robot")->getPosition()+(Ogre::Real)0.003*vecDevant);
270 if(mKeyboard->isKeyDown(OIS::KC_S) || mKeyboard->isKeyDown(OIS::KC_DOWN)){
271 mSceneMgr->getSceneNode(
"Robot")->setPosition(mSceneMgr->getSceneNode(
"Robot")->getPosition()-(Ogre::Real)0.003*vecDevant);
274 if(mKeyboard->isKeyDown(OIS::KC_Q) || mKeyboard->isKeyDown(OIS::KC_LEFT)){
275 rotmy = Ogre::Matrix3((Ogre::Real)cos(-angle), (Ogre::Real)sin(-angle), 0,
276 (Ogre::Real)(-sin(-angle)), (Ogre::Real)cos(-angle),0,
278 vecDevant=vecDevant*rotmy;
279 mSceneMgr->getSceneNode(
"Robot")->yaw(Ogre::Radian((Ogre::Real)(-angle)));
282 if(mKeyboard->isKeyDown(OIS::KC_D) || mKeyboard->isKeyDown(OIS::KC_RIGHT)){
283 rotmy = Ogre::Matrix3((Ogre::Real)cos(angle), (Ogre::Real)sin(angle), 0,
284 (Ogre::Real)(-sin(angle)), (Ogre::Real)cos(angle),0,
286 vecDevant=vecDevant*rotmy;
287 mSceneMgr->getSceneNode(
"Robot")->yaw(Ogre::Radian((Ogre::Real)angle));
293 mAnimationState = robot->getAnimationState(
"Walk");
295 else mAnimationState = robot->getAnimationState(
"Idle" );
298 mAnimationState->setLoop(
true );
300 mAnimationState->setEnabled(
true );
314 const bool &opt_click_allowed)
319 bool opt_display =
true;
321 #if defined(VISP_HAVE_X11) && ! defined(APPLE)
327 #elif defined VISP_HAVE_GTK
329 #elif defined VISP_HAVE_GDI
331 #elif defined VISP_HAVE_OPENCV
335 for (
unsigned int i=0 ; i < 4 ; i++)
348 display.
init(I,100,100,
"Preliminary Pose Calculation");
366 std::cout<<
"************************************************************************************"<<std::endl;
367 std::cout<<
"*************************** Preliminary Pose Calculation ***************************"<<std::endl;
368 std::cout<<
"****************************** Click on the 4 dots *******************************"<<std::endl;
369 std::cout<<
"********Dot1 : (-x,-y,0), Dot2 : (x,-y,0), Dot3 : (x,y,0), Dot4 : (-x,y,0)**********"<<std::endl;
370 std::cout<<
"************************************************************************************"<<std::endl;
374 if (! opt_click_allowed) {
384 for(
unsigned int i=0;i<4;i++) {
394 for(
unsigned int j = 0;j<i;j++)
400 if (opt_click_allowed)
444 for (
unsigned int i=0 ; i < 4 ; i++)
467 for (
unsigned int i=0 ; i < 4 ; i++)
483 for (
unsigned int i=0 ; i < 4 ; i++)
509 int main(
int argc,
const char **argv)
511 std::string env_ipath;
512 std::string opt_ipath;
514 std::string opt_ppath;
516 std::string filename;
517 bool opt_click_allowed =
true;
520 char *ptenv = getenv(
"VISP_INPUT_IMAGE_PATH");
525 if (! env_ipath.empty())
530 if (getOptions(argc, argv, opt_ipath, opt_ppath, opt_click_allowed) ==
false) {
535 if (!opt_ipath.empty())
540 if (!opt_ipath.empty() && !env_ipath.empty() && opt_ppath.empty()) {
541 if (ipath != env_ipath) {
542 std::cout << std::endl
543 <<
"WARNING: " << std::endl;
544 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
545 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
546 <<
" we skip the environment variable." << std::endl;
551 if (opt_ipath.empty() && env_ipath.empty() && opt_ppath.empty() ){
552 usage(argv[0], NULL, ipath, opt_ppath);
553 std::cerr << std::endl
554 <<
"ERROR:" << std::endl;
555 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
557 <<
" environment variable to specify the location of the " << std::endl
558 <<
" image path where test images are located." << std::endl
559 <<
" Use -p <personal image path> option if you want to "<<std::endl
560 <<
" use personal images." << std::endl
566 std::ostringstream s;
568 if (opt_ppath.empty()){
574 s.setf(std::ios::right, std::ios::adjustfield);
575 s <<
"image.%04d.pgm";
576 filename = dirname + s.str();
579 filename = opt_ppath;
612 vpCTRACE <<
"Load: " << filename << std::endl;
613 grabber.
open(Idisplay);
617 computeInitialPose(&mcamTmp, Idisplay, &mPose, md, mcog, &cmo, mP,
632 std::cerr << std::endl
633 <<
"ERROR:" << std::endl;
634 std::cerr <<
" Cannot read " << filename << std::endl;
635 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
636 <<
" or VISP_INPUT_IMAGE_PATH environment variable."
642 vpAROgreExample ogre(mcam, (
unsigned int)grabber.
getWidth(), (
unsigned int)grabber.
getHeight());
649 while(ogre.continueRendering()){
662 for (
int i=0 ; i < 4 ; i++)
665 md[i].
track(I, mcog[i]) ;
691 ogre.display(IC,cmo);
699 catch (Ogre::Exception& e)
701 std::cerr <<
"Exception:\n";
702 std::cerr << e.getFullDescription().c_str() <<
"\n";
707 std::cerr <<
"Exception: " <<
"\n";
713 #else // VISP_HAVE_OGRE
717 std::cout <<
"You should install Ogre3D to run this example..." << std::endl;
void setFirstFrameIndex(const long firstFrame)
void set_j(const double j)
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const char *title=NULL)
void init()
basic initialization with the default parameters
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
The class provides a data structure for the homogeneous matrices as well as a set of operations on th...
virtual bool customframeEnded(const Ogre::FrameEvent &evt)
Display for windows using GDI (available on any windows 32 platform).
Define the X11 console to display images.
void set_i(const double i)
Class that enables to manipulate easily a video file or a sequence of images. As it inherits from the...
void set_x(const double x)
Set the point x coordinate in the image plane.
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Point coordinates conversion from pixel coordinates to normalized coordinates in meter...
Implementation of an augmented reality viewer.
static int wait(double t0, double t)
This tracker is meant to track a blob (connex pixels with same gray level) on a vpImage.
void track(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that defines what is a point.
vpImagePoint getCog() const
void open(vpImage< vpRGBa > &I)
void setGrayLevelPrecision(const double &grayLevelPrecision)
static void display(vpImage< unsigned char > &I, vpHomogeneousMatrix &cMo, vpCameraParameters &cam, double size, vpColor col=vpColor::none)
unsigned int getWidth() const
Return the number of columns in the image.
virtual bool processInputEvent(const Ogre::FrameEvent &)
static void display(const vpImage< unsigned char > &I)
The vpDisplayOpenCV allows to display image using the opencv library.
virtual void displayCross(const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)=0
Class used for pose computation from N points (pose from point only).
Generic class defining intrinsic camera parameters.
void set_y(const double y)
Set the point y coordinate in the image plane.
The vpDisplayGTK allows to display image using the GTK+ library version 1.2.
void acquire(vpImage< vpRGBa > &I)
void setFileName(const char *filename)
void display(const vpImage< unsigned char > &I, vpColor color=vpColor::red, unsigned int thickness=1)
void setSizePrecision(const double &sizePrecision)
virtual void createScene(void)
void initTracking(const vpImage< unsigned char > &I, unsigned int size=0)
void computePose(vpPoseMethodType methode, vpHomogeneousMatrix &cMo)
compute the pose for a given method
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void addPoint(const vpPoint &P)
Add a new point in this array.
unsigned int getHeight() const
Return the number of rows in the image.
void setGraphics(const bool activate)
void setWorldCoordinates(const double ox, const double oy, const double oz)
Set the point world coordinates. We mean here the coordinates of the point in the object frame...
void clearPoint()
suppress all the point in the array of point