diff --git a/app/SandboxSetup/beamerlocationgui.cpp b/app/SandboxSetup/beamerlocationgui.cpp index 3b2c2b80da75e4c1aa20a1a67d7299b9d1240b4e..3e0d14344d2eb77cb800d8b2a26521eb1a1f3102 100644 --- a/app/SandboxSetup/beamerlocationgui.cpp +++ b/app/SandboxSetup/beamerlocationgui.cpp @@ -21,6 +21,7 @@ BeamerLocationGui::BeamerLocationGui(SandboxSetup *_setup, MonitorGui *_mg, QWid winFullScreen = new QtFullScreen(mg->getResolution(), true, this); ui->setupUi(this); ui->txtInstructions->setAlignment(Qt::AlignJustify); + mut = new QMutex(); myThread = new RefreshFrame(this); timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &BeamerLocationGui::refreshRoutine); @@ -30,6 +31,7 @@ BeamerLocationGui::~BeamerLocationGui() { delete timer; delete myThread; + delete mut; delete winFullScreen; delete ui; } @@ -71,7 +73,7 @@ void BeamerLocationGui::startRoutine(){ directions = std::vector<cv::Point3d>(); bases = std::vector<cv::Point3d>(); capturedPoints = std::vector<cv::Point3f>(); - circle = std::vector<cv::Point3i>(); + circles = std::vector<cv::Point3i>(); updateLabelSteps(); if(myThread->isRunning()){ @@ -95,32 +97,35 @@ void BeamerLocationGui::routineFrame(){ depth = camera->getDepthFrame(); rgb = camera->getColorFrame(); - // Look for the circle target + // Look for the circles target double minDist = rgb.cols*(double)profil->getMinDistance()/100; double minRadius = (profil->getMinRadius()>0) ? rgb.cols*(double)profil->getMinRadius()/100 : 0; double maxRadius = (profil->getMaxRadius()>0) ? rgb.cols*(double)profil->getMaxRadius()/100 : 0; - circle = beamer->findCircles( rgb, - profil->getContrast(), - profil->getBrightness(), - minDist, - (int)profil->getCannyEdgeThreshold(), - (int)profil->getHoughAccThreshold(), - minRadius, - maxRadius ); + std::vector<cv::Point3i> tmp_circles = beamer->findCircles( rgb, + profil->getContrast(), + profil->getBrightness(), + minDist, + (int)profil->getCannyEdgeThreshold(), + (int)profil->getHoughAccThreshold(), + minRadius, + maxRadius ); + mut->lock(); + circles = tmp_circles; + mut->unlock(); // preview from the camera's POV cv::Mat gray, frameDisplayed; cv::cvtColor(rgb, gray, CV_BGR2GRAY); gray = setup->getBeamer()->editContrast(gray, (double)profil->getContrast(), (double)profil->getBrightness()); cv::cvtColor(gray, frameDisplayed, CV_GRAY2RGB); - if(!circle.empty()){ - cv::circle(frameDisplayed, cv::Point(circle[0].x, circle[0].y), circle[0].z, cv::Scalar(0,255,0), 3); + if(!circles.empty()){ + cv::circle(frameDisplayed, cv::Point(circles[0].x, circles[0].y), circles[0].z, cv::Scalar(0,255,0), 3); } QImage img = QImage((uchar *)frameDisplayed.data, (int)frameDisplayed.cols, (int)frameDisplayed.rows, static_cast<int>(frameDisplayed.step.buf[0]), QImage::Format_RGB888); QPixmap px = QPixmap::fromImage(img); // Show black screen with cross - cv::Mat frameImage = beamer->getCrossFrame(cross, capturedPoints.size()+1, beamer->MAX_LINEAR_LINE_POINTS, !circle.empty()); + cv::Mat frameImage = beamer->getCrossFrame(cross, capturedPoints.size()+1, beamer->MAX_LINEAR_LINE_POINTS, !circles.empty()); cv::cvtColor(frameImage, frameImage, CV_BGR2RGB); ui->lblFrame->setPixmap(px); @@ -131,9 +136,17 @@ void BeamerLocationGui::routineFrame(){ void BeamerLocationGui::userValidePoint(){ - if(!circle.empty()){ + std::vector<cv::Point3i> tmp_circles; + mut->lock(); + if(!circles.empty()){ + tmp_circles = circles; + circles.clear(); + } + mut->unlock(); - capturedPoints.push_back( beamer->deprojectPixel(cv::Point2i(circle.at(0).x, circle.at(0).y), &depth, camera) ); + if(!tmp_circles.empty()){ + cv::Point2i circle_pos = cv::Point2i(tmp_circles.at(0).x, tmp_circles.at(0).y); + capturedPoints.push_back( beamer->deprojectPixel(circle_pos, &depth, camera) ); updateLabelSteps(); // enough points to perform linear regression and move into next step @@ -141,7 +154,6 @@ void BeamerLocationGui::userValidePoint(){ beamer->findLinearLineFrom(&capturedPoints, &bases, &directions); capturedPoints.clear(); - circle.clear(); stepCross++; if((uint)stepCross >= crosses.size()){ diff --git a/app/SandboxSetup/beamerlocationgui.h b/app/SandboxSetup/beamerlocationgui.h index 3010601d5bbe5bcdf4165d74cacc706272c12c9a..f095bdd4e968f2b1928b5e535ee8f2729ef9980a 100644 --- a/app/SandboxSetup/beamerlocationgui.h +++ b/app/SandboxSetup/beamerlocationgui.h @@ -63,7 +63,8 @@ private: std::vector<cv::Point3f> capturedPoints; cv::Mat depth; cv::Mat rgb; - std::vector<cv::Point3i> circle; + QMutex *mut; + std::vector<cv::Point3i> circles; int stepCross = 0; QTimer *timer; RefreshFrame *myThread;