int main( int argc, char **argv ) { if(argc<4) { usage(argc,argv); return 1; } is = helper::createImageSource(argv[1]); if(is.empty() || is->done()) { loglne("[main] createImageSource failed or no valid imagesource!"); return -1; } is->pause(false); is->reportInfo(); is->get(frame); imgW = frame.cols; imgH = frame.rows; videoFromWebcam = false; if( is->classname() == "ImageSource_Camera" ) { videoFromWebcam = true; } loglni("[main] loading K matrix from: "<<argv[2]); double K[9]; std::ifstream kfile(argv[2]); for(int i=0; i<9; ++i) kfile >> K[i]; tracker.loadK(K); loglni("[main] K matrix loaded:"); loglni(helper::PrintMat<>(3,3,K)); loglni("[main] load template image from: "<<argv[3]); tracker.loadTemplate(argv[3]); //////////////// TagDetector ///////////////////////////////////////// int tagid = 0; //default tag16h5 if(argc>5) tagid = atoi(argv[5]); tagFamily = TagFamilyFactory::create(tagid); if(tagFamily.empty()) { loglne("[main] create TagFamily fail!"); return -1; } detector = new TagDetector(tagFamily); if(detector.empty()) { loglne("[main] create TagDetector fail!"); return -1; } Mat temp = imread(argv[3]); if( findAprilTag(temp, 0, HI, true) ) { namedWindow("template"); imshow("template", temp); iHI = HI.inv(); } else { loglne("[main error] detector did not find any apriltag on template image!"); return -1; } //////////////// OSG //////////////////////////////////////////////// osg::ref_ptr<osg::Group> root = new osg::Group; string scenefilename = (argc>4?argv[4]:("cow.osg")); osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile(scenefilename); arscene = new helper::ARSceneRoot; helper::FixMat<3,double>::Type matK = helper::FixMat<3,double>::ConvertType(K); CV2CG::cv2cg(matK,0.01,500,imgW,imgH,*arscene); manipMat = new osg::MatrixTransform(osg::Matrix::identity()); manipMat->addChild(cow); manipMat->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); arscene->addChild(manipMat); osg::ref_ptr<osg::Image> backgroundImage = new osg::Image; helper::cvmat2osgimage(frame,backgroundImage); arvideo = new helper::ARVideoBackground(backgroundImage); root->setUpdateCallback(new ARUpdateCallback); root->addChild(arvideo); root->addChild(arscene); viewer.setSceneData(root); viewer.addEventHandler(new osgViewer::StatsHandler); viewer.addEventHandler(new osgViewer::WindowSizeHandler); viewer.addEventHandler(new QuitHandler); //start tracking thread OpenThreads::Thread::Init(); TrackThread* thr = new TrackThread; thr->start(); viewer.run(); delete thr; loglni("[main] DONE...exit!"); return 0; }
virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN) { switch(ea.getKey()) { case osgGA::GUIEventAdapter::KEY_Escape: OpenCVneedQuit=true; loglni("[QuitHandler] OSG notify OpenCV to quit..."); break; case ' ': needToInit=true; break; case 'd': opencvDraw = !opencvDraw; break; case '.': //> sx+=0.4;sy+=0.4;sz+=0.4; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case ',': //< sx-=0.2;sy-=0.2;sz-=0.2; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case 'c': needToCapframe = !needToCapframe; if(needToCapframe) loglni("[Capture Frame] Begin."); else loglni("[Capture Frame] End."); break; case 'h': QuitHandler::usage(); break; case '1': switchARVideo(); break; case '2': switchARScene(); break; case osgGA::GUIEventAdapter::KEY_KP_Up: my+=10; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case osgGA::GUIEventAdapter::KEY_KP_Down: my-=5; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case osgGA::GUIEventAdapter::KEY_KP_Left: mx-=5; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case osgGA::GUIEventAdapter::KEY_KP_Right: mx+=10; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case osgGA::GUIEventAdapter::KEY_Page_Up: mz+=10; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case osgGA::GUIEventAdapter::KEY_Page_Down: mz-=5; manipMat->setMatrix(osg::Matrix::translate(mx,my,mz)*osg::Matrix::scale(sx,sy,sz)); break; case 'p': { static bool pa=false; is->pause(pa); pa = !pa; break; } case 'l': { static bool lo=false; is->loop(lo); lo = !lo; break; } }//end of switch } return true; }