void cvTackBarEvents(int pos,void*) { if (iThresParam1<3) iThresParam1=3; if (iThresParam1%2!=1) iThresParam1++; if (ThresParam2<1) ThresParam2=1; ThresParam1=iThresParam1; ThresParam2=iThresParam2; TheBoardDetector.getMarkerDetector().setThresholdParams(ThresParam1,ThresParam2); //recompute //Detection of the board float probDetect=TheBoardDetector.detect( TheInputImage); if (TheCameraParameters.isValid() && probDetect>0.2) aruco::CvDrawingUtils::draw3dAxis(TheInputImageCopy,TheBoardDetector.getDetectedBoard(),TheCameraParameters); cv::imshow("in",TheInputImageCopy); cv::imshow("thres",TheBoardDetector.getMarkerDetector().getThresholdedImage()); }
int main(int argc, char** argv) { try { if (readArguments(argc, argv) == false) return 0; // read board configuration TheBoardConfig.readFromFile(TheBoardConfigFile); // Open video input source if (TheInputVideo == "") // read from camera TheVideoCapturer.open(0); else TheVideoCapturer.open(TheInputVideo); if (!TheVideoCapturer.isOpened()) { cerr << "Could not open video" << endl; return -1; } // read first image TheVideoCapturer >> TheInputImage; // read camera paramters if passed TheCameraParams.readFromXMLFile(TheIntrinsicFile); TheCameraParams.resize(TheInputImage.size()); TheBoardDetector.getMarkerDetector().setThresholdParams(25, 7); glutInit(&argc, argv); glutInitWindowPosition(0, 0); glutInitWindowSize(TheInputImage.size().width, TheInputImage.size().height); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutCreateWindow("ArUco"); glutDisplayFunc(vDrawScene); glutIdleFunc(vIdle); glutReshapeFunc(vResize); glutMouseFunc(vMouse); glClearColor(0.0, 0.0, 0.0, 1.0); glClearDepth(1.0); // these two are necesary for the mask effect glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.5); TheGlWindowSize = TheInputImage.size(); vResize(TheGlWindowSize.width, TheGlWindowSize.height); glutMainLoop(); } catch (std::exception& ex) { cout << "Exception :" << ex.what() << endl; } }
int main(int argc,char **argv) { try { if ( readArguments (argc,argv)==false) return 0; //parse arguments TheBoardConfig.readFromFile(TheBoardConfigFile); //read from camera or from file if (TheInputVideo=="live") { TheVideoCapturer.open(0); waitTime=10; } else TheVideoCapturer.open(TheInputVideo); //check video is open if (!TheVideoCapturer.isOpened()) { cerr<<"Could not open video"<<endl; return -1; } //read first image to get the dimensions TheVideoCapturer>>TheInputImage; //Open outputvideo if ( TheOutVideoFilePath!="") VWriter.open(TheOutVideoFilePath,CV_FOURCC('M','J','P','G'),15,TheInputImage.size()); //read camera parameters if passed if (TheIntrinsicFile!="") { TheCameraParameters.readFromXMLFile(TheIntrinsicFile); TheCameraParameters.resize(TheInputImage.size()); } //Create gui cv::namedWindow("thres",1); cv::namedWindow("in",1); TheBoardDetector.setParams(TheBoardConfig,TheCameraParameters,TheMarkerSize); TheBoardDetector.getMarkerDetector().getThresholdParams( ThresParam1,ThresParam2); TheBoardDetector.getMarkerDetector().enableErosion(true);//for chessboards iThresParam1=ThresParam1; iThresParam2=ThresParam2; cv::createTrackbar("ThresParam1", "in",&iThresParam1, 13, cvTackBarEvents); cv::createTrackbar("ThresParam2", "in",&iThresParam2, 13, cvTackBarEvents); char key=0; int index=0; //capture until press ESC or until the end of the video while ( key!=27 && TheVideoCapturer.grab()) { TheVideoCapturer.retrieve( TheInputImage); TheInputImage.copyTo(TheInputImageCopy); index++; //number of images captured double tick = (double)getTickCount();//for checking the speed //Detection of the board float probDetect=TheBoardDetector.detect(TheInputImage); //chekc the speed by calculating the mean speed of all iterations AvrgTime.first+=((double)getTickCount()-tick)/getTickFrequency(); AvrgTime.second++; cout<<"Time detection="<<1000*AvrgTime.first/AvrgTime.second<<" milliseconds"<<endl; //print marker borders for (unsigned int i=0;i<TheBoardDetector.getDetectedMarkers().size();i++) TheBoardDetector.getDetectedMarkers()[i].draw(TheInputImageCopy,Scalar(0,0,255),1); //print board if (TheCameraParameters.isValid()) { if ( probDetect>0.2) { CvDrawingUtils::draw3dAxis( TheInputImageCopy,TheBoardDetector.getDetectedBoard(),TheCameraParameters); //draw3dBoardCube( TheInputImageCopy,TheBoardDetected,TheIntriscCameraMatrix,TheDistorsionCameraParams); } } //DONE! Easy, right? //show input with augmented information and the thresholded image cv::imshow("in",TheInputImageCopy); cv::imshow("thres",TheBoardDetector.getMarkerDetector().getThresholdedImage()); //write to video if required if ( TheOutVideoFilePath!="") { //create a beautiful compiosed image showing the thresholded //first create a small version of the thresholded image cv::Mat smallThres; cv::resize( TheBoardDetector.getMarkerDetector().getThresholdedImage(),smallThres,cvSize(TheInputImageCopy.cols/3,TheInputImageCopy.rows/3)); cv::Mat small3C; cv::cvtColor(smallThres,small3C,CV_GRAY2BGR); cv::Mat roi=TheInputImageCopy(cv::Rect(0,0,TheInputImageCopy.cols/3,TheInputImageCopy.rows/3)); small3C.copyTo(roi); VWriter<<TheInputImageCopy; // cv::imshow("TheInputImageCopy",TheInputImageCopy); } key=cv::waitKey(waitTime);//wait for key to be pressed processKey(key); } } catch (std::exception &ex) { cout<<"Exception :"<<ex.what()<<endl; } }