void CubicSpline::randomNoise( double stdDevPos, double stdDevVel, bool updateBounds) { //Initialize the generator std::mt19937 generator(static_cast<long unsigned int>( std::chrono::high_resolution_clock::now() .time_since_epoch().count())); std::normal_distribution<double> distPos(0.0, stdDevPos); std::normal_distribution<double> distVel(0.0, stdDevVel); //Apply noise on points for (size_t i=0;i<_points.size();i++) { if (!updateBounds && (i == 0 || i == _points.size()-1)) { continue; } double deltaPos = distPos(generator); double deltaVel = distVel(generator); _points[i].position += deltaPos; _points[i].velocity += deltaVel; } //Recompute the splines computeSplines(); }
void LevelTracker::update(const VisionCore::Frame<cv::Mat>& frame){ // Cria uma sub-imagem contendo a "region of interest" cv::Rect roi(topLeft,bottonRight); const cv::Mat& originalImg = frame.getImg(); cv::Mat img = originalImg(roi); // Converte para espaço de cor Lab cv::Mat imgLab; cv::cvtColor(img,imgLab,CV_BGR2Lab); // Para cada linha, calcula distâncias para referências std::vector<double> distPos(img.rows); //distância cumulativa para a referência em cada linha std::vector<double> distNeg(img.rows); double distPosCum=0; double distNegCum=0; for(int i=0;i<imgLab.rows;i++){ cv::Mat row=imgLab.row(i); cv::Scalar meanColor = cv::mean(row); distPos[i]=distPosCum+cv::norm(meanColor,positiveColorLab,cv::NORM_L2); distNeg[i]=distNegCum+cv::norm(meanColor,negativeColorLab,cv::NORM_L2); distPosCum=distPos[i]; distNegCum=distNeg[i]; } // Decide nível. Calcula o erro de decisão para cada linha. double minError=std::numeric_limits<double>::max(); int minErrorIndex=0; for(int i=0;i<imgLab.rows;i++){ double error=distNeg[i]+distPos[imgLab.rows-1]-distPos[i]; if(error<minError){ minError=error; minErrorIndex=i; } } level=(imgLab.rows-minErrorIndex)/(double)imgLab.rows; /// True se algo não está configurado m_lostTrack = !negColOk || !posColOk || !regOk; }