bool processFrame(const cv::Mat& cameraFrame, std::auto_ptr<MarkerDetectionFacade>& detector, ARDrawingContext& drawingCtx) { // Clone image used for background (we will draw overlay on it) cv::Mat img = cameraFrame.clone(); // Draw information: // if (pipeline.m_patternDetector.enableHomographyRefinement) // cv::putText(img, "Pose refinement: On ('h' to switch off)", cv::Point(10,15), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); // else // cv::putText(img, "Pose refinement: Off ('h' to switch on)", cv::Point(10,15), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); // cv::putText(img, "RANSAC threshold: " + ToString(pipeline.m_patternDetector.homographyReprojectionThreshold) + "( Use'-'/'+' to adjust)", cv::Point(10, 30), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); // Set a new camera frame: drawingCtx.updateBackground(img); // Find a pattern and update it's detection status: BGRAVideoFrame cameraImage(cameraFrame); drawingCtx.isPatternPresent = detector->processFrame(cameraImage); std::vector<Transformation> vec_trans = detector->getTransformations(); if(!vec_trans.empty()) { // Update a pattern pose: drawingCtx.patternPose = vec_trans[0]; // Request redraw of the window: drawingCtx.updateWindow(); } // Read the keyboard input: int keyCode = cv::waitKey(5); bool shouldQuit = false; //if (keyCode == '+' || keyCode == '=') //{ // pipeline.m_patternDetector.homographyReprojectionThreshold += 0.2f; // pipeline.m_patternDetector.homographyReprojectionThreshold =/* std::*/min(10.0f, pipeline.m_patternDetector.homographyReprojectionThreshold); //} //else if (keyCode == '-') //{ // pipeline.m_patternDetector.homographyReprojectionThreshold -= 0.2f; // pipeline.m_patternDetector.homographyReprojectionThreshold = /*std::*/max(0.0f, pipeline.m_patternDetector.homographyReprojectionThreshold); //} //else if (keyCode == 'h') //{ // pipeline.m_patternDetector.enableHomographyRefinement = !pipeline.m_patternDetector.enableHomographyRefinement; //} //else if (keyCode == 27 || keyCode == 'q') //{ // shouldQuit = true; //} return shouldQuit; }
/** * Performs full detection routine on camera frame and draws the scene using drawing context. * In addition, this function draw overlay with debug information on top of the AR window. * Returns true if processing loop should be stopped; otherwise - false. */ bool processFrame(const cv::Mat& cameraFrame, ARPipeline& pipeline, ARDrawingContext& drawingCtx) { // Clone image used for background (we will draw overlay on it) cv::Mat img = cameraFrame.clone(); // Draw information: if (pipeline.m_patternDetector.enableHomographyRefinement) cv::putText(img, "Pose refinement: On ('h' to switch off)", cv::Point(10,15), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); else cv::putText(img, "Pose refinement: Off ('h' to switch on)", cv::Point(10,15), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); cv::putText(img, "RANSAC threshold: " + ToString(pipeline.m_patternDetector.homographyReprojectionThreshold) + "( Use'-'/'+' to adjust)", cv::Point(10, 30), CV_FONT_HERSHEY_PLAIN, 1, CV_RGB(0,200,0)); // Set a new camera frame: drawingCtx.updateBackground(img); // Find a pattern and update it's detection status: drawingCtx.isPatternPresent = pipeline.processFrame(cameraFrame); // Update a pattern pose: drawingCtx.patternPose = pipeline.getPatternLocation(); // Request redraw of the window: drawingCtx.updateWindow(); // Read the keyboard input: int keyCode = cv::waitKey(5); bool shouldQuit = false; if (keyCode == '+' || keyCode == '=') { pipeline.m_patternDetector.homographyReprojectionThreshold += 0.2f; pipeline.m_patternDetector.homographyReprojectionThreshold = std::min(10.0f, pipeline.m_patternDetector.homographyReprojectionThreshold); } else if (keyCode == '-') { pipeline.m_patternDetector.homographyReprojectionThreshold -= 0.2f; pipeline.m_patternDetector.homographyReprojectionThreshold = std::max(0.0f, pipeline.m_patternDetector.homographyReprojectionThreshold); } else if (keyCode == 'h') { pipeline.m_patternDetector.enableHomographyRefinement = !pipeline.m_patternDetector.enableHomographyRefinement; } else if (keyCode == 27 || keyCode == 'q') { shouldQuit = true; } return shouldQuit; }