예제 #1
0
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;
}