예제 #1
0
double MIDDistanceCalculator::getMIDDistance(std::pair<std::vector<double>, std::vector<double> > const &aligned, size_t origSize1, size_t origSize2)
{
    const std::vector<double> &alV1 = aligned.first;
    const std::vector<double> &alV2 = aligned.second;

    // printAlignedVectors(alV1, alV2);

    double dist;

    switch(distanceMeasure) {
    case D_EUCLIDEAN:
        dist = getEuclideanDistance(alV1, alV2);
        break;
    case D_CANBERRA:
        dist = getCanberraDistance(alV1, alV2);
        break;
    case D_MANHATTAN:
        dist = getManhattanDistance(alV1, alV2);
        break;
    case D_COSINE:
        dist = getCosineCorrelation(alV1, alV2);
        break;
    case D_CUSTOM:
        dist = getCustomDistance(alV1, alV2);
        break;
    default:
        dist = getEuclideanDistance(alV1, alV2);
    }

    double divideBy = 1;

    origSize1 = origSize1?alV1.size():origSize1;
    origSize2 = origSize2?alV2.size():origSize2;

    switch(MIDDistanceCalculator::distanceNormalization) {
    case DN_MAX:
        divideBy = std::max(origSize1, origSize2);
        break;
    case DN_MIN:
        divideBy = std::min(origSize1, origSize2);
        break;
    case DN_PROD:
        divideBy = origSize1 * origSize2;
        break;
    case DN_SUM:
        divideBy = origSize1 + origSize2;
        break;
    }

    // log(alV2.size())

    return fabs(dist / divideBy);
}
예제 #2
0
void TimeWarp::calculateCausalChromaSimilarityMatrix(DoubleMatrix& firstChromaMatrix, DoubleMatrix& secondChromaMatrix, DoubleMatrix& simMatrix){
	//calculates the chroma only similarity matrix 
	//but we have already done some, so is extending it...
	
	int size = 0;
	if (simMatrix.size() > 0){
		size = simMatrix[0].size();
	}
	
	if (secondChromaMatrix.size() > size ){
	
	for (int x = 0;x < firstChromaMatrix.size();x++){
		
		if (x < simMatrix.size()){
			//i.e. entries already exist
				for (int y = (int)simMatrix[x].size();y < secondChromaMatrix.size();y++){
					double distance;
					if (useDotProduct)
					distance = getChromaSimilarity(x, y, &firstChromaMatrix, &secondChromaMatrix);
					else
					distance = getEuclideanDistance(x, y, &firstChromaMatrix, &secondChromaMatrix);
				
					printf("putting one back X %i Y %i dist %f \n", x, y, distance);
					simMatrix[x].push_back(distance);
				}
			}
		else {
			DoubleVector d;
			for (int y = 0;y < secondChromaMatrix.size();y++){
					double distance;
					if (useDotProduct)
					distance = getChromaSimilarity(x, y, &firstChromaMatrix, &secondChromaMatrix);
					else
					distance = getEuclideanDistance(x, y, &firstChromaMatrix, &secondChromaMatrix);
			
				printf("new row X %i Y %i dist %f\n", x, y, distance);
					d.push_back( distance);	
				}
				simMatrix.push_back(d);
			}
		}
	}
			if (size > 0)
				printf("Causial CHROMA ONLY SIM SIZE %i x %i; ", (int)simMatrix.size(), (int) simMatrix[0].size());
		printf("First matrix SIZE %i , SECOND size %i\n", (int)firstChromaMatrix.size(), (int) secondChromaMatrix.size());	

	
}
예제 #3
0
void TimeWarp::calculatePartSimilarityMatrix(DoubleMatrix* firstChromaMatrix, DoubleMatrix* secondChromaMatrix, DoubleMatrix* simMatrix, int startX, int startY, int endX){
//	printf("Calculate similarity : pointers : size %i x %i  ", (int) firstChromaMatrix.size(), (int) secondChromaMatrix.size());
	
	simMatrix->clear();
	
	double distance, firstSum, secondSum;
	endX = min (endX, (int)(*firstChromaMatrix).size()-1);//in case out of size
	
	for (int x = startX;x <= endX;x++){
		DoubleVector d;
		
		for (int y = startY;y < (*secondChromaMatrix).size();y++){

			if (useDotProduct)
				distance  = getChromaSimilarity(x, y, firstChromaMatrix, secondChromaMatrix);
			else
				distance = getEuclideanDistance(x, y, firstChromaMatrix, secondChromaMatrix);
			
			d.push_back( distance);	
		}	//end for y
		
		(*simMatrix).push_back(d);
		
	}//end for x
	
	printf("..part sim size: %i, height: %i \n", (int) (*simMatrix).size(), (int) (*simMatrix)[0].size());
	
}//end self sim
예제 #4
0
void TimeWarp::calculateSimilarityMatrixWithPointers(DoubleMatrix* firstChromaMatrix, DoubleMatrix* secondChromaMatrix, DoubleMatrix* simMatrix){
	printf("Calculate similarity : pointers : size %i x %i  ", (int) (*firstChromaMatrix).size(), (int) (*secondChromaMatrix).size());
	
	simMatrix->clear();

	double distance, firstSum, secondSum;
	
	for (int x = 0;x < (*firstChromaMatrix).size();x++){
		DoubleVector d;
		
		for (int y = 0;y < (*secondChromaMatrix).size();y++){
			
			if (useDotProduct)
				distance = getChromaSimilarity(x, y, firstChromaMatrix, secondChromaMatrix);
			else
				distance = getEuclideanDistance(x, y, firstChromaMatrix, secondChromaMatrix);
			
			d.push_back( distance);	
		}	//end for y
		
		(*simMatrix).push_back(d);
		
	}//end for x

		 printf("..sim size: %i, height: %i \n", (int) (*simMatrix).size(), (int) (*simMatrix)[0].size());
	
}//end self sim
hbrs_msgs::LaserScanSegmentList LaserScanSegmentation::getSegments(const sensor_msgs::LaserScan::ConstPtr &inputScan, bool store_data_points)
{
	hbrs_msgs::LaserScanSegmentList segments;
	vector<geometry_msgs::Point> data_points;

	double dNumberofPointsBetweenStartAndEnd = 0;
	unsigned int unSegmentStartPoint = 0;
	unsigned int unSegmentEndPoint = 0;

	uint32_t scan_size = ceil((inputScan->angle_max - inputScan->angle_min) / inputScan->angle_increment);

	if(scan_size == 0)
		return segments;

	//run over laser scan data

	for(unsigned int i = 0; i < (scan_size - 1); ++i)
	{
		++dNumberofPointsBetweenStartAndEnd;

		// first point in laser scan is start point of the first segment
		if(i == 0)
			unSegmentStartPoint = i;

		// the distance between two adjacent points is above a given threshold -> remember end point and start with a new segment
		//cout << "angle: " << ppdLaserScan[i][BUFFER_COLUMN_YAW] << " " << (ppdLaserScan[i][BUFFER_COLUMN_YAW] * 180 / M_PI) << std::endl;

		double dAngleCur = inputScan->angle_min + (i * inputScan->angle_increment);
		double dDistanceCur = inputScan->ranges[i];
		double dAngleNext = inputScan->angle_min + ((i+1) * inputScan->angle_increment);
		double dDistanceNext = inputScan->ranges[i+1];

		if(store_data_points)
		{
			geometry_msgs::Point cur_point;
			cur_point.x = dDistanceCur * cos(dAngleCur);
			cur_point.y = dDistanceCur * sin(dAngleCur);
			data_points.push_back(cur_point);
		}

//		cout << "a: " << dAngleCur << " d: " << dDistanceCur << " a: " << dAngleNext<< " d: " << dAngleNext << endl;

		if((getEuclideanDistance(dDistanceCur, dAngleCur, dDistanceNext, dAngleNext) > this->_dThresholdDistanceBetweenAdajecentPoints) || (i == (scan_size - 2)))
		{
			if( i < (scan_size - 2))
				unSegmentEndPoint = i;
			else
				unSegmentEndPoint = i+1;

			// if number of points between start and end point is lesser then 3 , it is not a segment
			if(dNumberofPointsBetweenStartAndEnd >= this->_unMinimumPointsPerSegment )
			{
				geometry_msgs::Point centerPoint;
				centerPoint = getCenterOfGravity(unSegmentStartPoint, unSegmentEndPoint, inputScan);
				double dDistanceToSegment = sqrt( pow(centerPoint.x, 2.0) + pow(centerPoint.y, 2.0));

				if(dDistanceToSegment < 5.0)
				{
					hbrs_msgs::LaserScanSegment seg;

					seg.header = inputScan->header;
					seg.header.stamp = ros::Time::now();
					seg.center.x = centerPoint.x;
					seg.center.y = centerPoint.y;

					if(store_data_points)
						seg.data_points = data_points;

					/*
					cout << "eucl: " << getEuclideanDistance(dDistanceCur, dAngleCur, dDistanceNext, dAngleNext) << " thr: " << this->_dThresholdDistanceBetweenAdajecentPoints << 	endl;
					cout << "new segmented: " << endl;
					cout << "dist: : " << dDistanceToSegment << endl;
					*/

					segments.segments.push_back(seg);
				}
			}

			if( i < (scan_size - 2))
			{
				unSegmentStartPoint = i+1;
				dNumberofPointsBetweenStartAndEnd = 0;

				if(store_data_points)
					data_points.clear();
			}
		}
	}

	segments.header = inputScan->header;
	segments.header.stamp = ros::Time::now();
	segments.num_segments = segments.segments.size();

	return segments;
}
예제 #6
0
void TimeWarp::calculateRestrictedCausalChromaSimilarityMatrix(DoubleMatrix& firstChromaMatrix, DoubleMatrix& secondChromaMatrix, DoubleMatrix& simMatrix, const int& Xstart, const int& Ystart, const int& Xlimit, const int& yLimit){
//calculates the chroma only similarity matrix - used to reduce computation later when doing the joint energy and chroma matrix
	DoubleVector d;
	
	int size = 0;
	if (simMatrix.size() > 0){
		size = simMatrix[0].size();
	}
	
	if (secondChromaMatrix.size() > size ){
	//	printf("sim matrix size %i and second matrix size %i Xstart %i\n", simMatrix.size(), secondChromaMatrix.size(), Xstart);
		for (int x = 0;x < Xstart;x++){
			simMatrix[x].push_back(0);
		}
		
		int endX = min(Xlimit, (int)firstChromaMatrix.size());
		
		
		for (int x = Xstart;x < endX;x++){
	
			if (x < simMatrix.size()){
				//i.e. entries already exist
				for (int y = (int)simMatrix[x].size();y < secondChromaMatrix.size();y++){
					double distance;
					if (useDotProduct)
						distance = getChromaSimilarity(x, y, &firstChromaMatrix, &secondChromaMatrix);
					else
						distance = getEuclideanDistance(x, y, &firstChromaMatrix, &secondChromaMatrix);
					
					//	printf("X %i Y %i dist %f\n", x, y, distance);
					simMatrix[x].push_back(distance);
				}
			}
			else {
				DoubleVector d;
				for (int y = 0;y < secondChromaMatrix.size();y++){
					double distance;
					if (useDotProduct)
						distance = getChromaSimilarity(x, y, &firstChromaMatrix, &secondChromaMatrix);
					else
						distance = getEuclideanDistance(x, y, &firstChromaMatrix, &secondChromaMatrix);
					
					//	printf("new row X %i Y %i dist %f\n", x, y, distance);
					d.clear();
					d.push_back( distance);	
				}
				simMatrix.push_back(d);
			}
			
		}//end for good section
		
		for (int x = endX;x < firstChromaMatrix.size(); x++){
			if (x < simMatrix.size()){
				simMatrix[x].push_back(0);
			}else{
				d.clear();
				d.push_back(0);
				simMatrix.push_back(d);
			}
		}//end for x to end
		
	}
	//	if (size > 0)
	//		printf("Causial CHROMA ONLY SIM SIZE %i x %i; ", (int)simMatrix.size(), (int) simMatrix[0].size());
	//printf("First matrix SIZE %i , SECOND size %i\n", (int)firstChromaMatrix.size(), (int) secondChromaMatrix.size());	
	

}