예제 #1
0
AntipoleNode* AntipoleTree::buildNewNode(float minimum_size, const MatchingThumbnails& old_matching)
{
  MatchingThumbnails left_matching;
  MatchingThumbnails right_matching;
  std::vector<float> left_center;
  std::vector<float> right_center;

  if (old_matching.size() > minimum_size)
  {
    int status = divideMatching(old_matching, left_center, right_center, left_matching, right_matching);
    if(status == 1)
    {
      AntipoleInternalNode* node = new AntipoleInternalNode(this);
      QFuture<AntipoleNode*> left_future = QtConcurrent::run(this, &AntipoleTree::buildNewNode, minimum_size, left_matching);
      QFuture<AntipoleNode*> right_future = QtConcurrent::run(this, &AntipoleTree::buildNewNode, minimum_size, right_matching);
      AntipoleNode* left = left_future.result();
      AntipoleNode* right = right_future.result();
      node->setLeft(left);
      computeCenter(left_center, left_matching);
      left->setCenter(left_center);
      left->setRadius(computeMaxRadius(left_center, left_matching));
      node->setRight(right);
      computeCenter(right_center, right_matching);
      right->setCenter(right_center);
      right->setRadius(computeMaxRadius(right_center, right_matching));
    }
  }
  AntipoleLeaf* leaf = new AntipoleLeaf(this);
  leaf->setMatching(old_matching);
  return leaf;
}
예제 #2
0
void GestureRecognizer::setupPinchData(const NIXTouchEvent& event)
{
    const NIXTouchPoint& first = event.touchPoints[0];
    const NIXTouchPoint& second = event.touchPoints[1];

    m_initialPinchDistance = computeDistance(WKPointMake(first.globalX, first.globalY), WKPointMake(second.globalX, second.globalY));
    m_initialPinchScale = m_client->scale();
    m_initialPinchContentCenter = computeCenter(WKPointMake(first.x, first.y), WKPointMake(second.x, second.y));
    m_previousPinchGlobalCenter = computeCenter(WKPointMake(first.globalX, first.globalY), WKPointMake(second.globalX, second.globalY));
}
예제 #3
0
/** @brief computes best-fit approximations.
    @param[in] points   vector of points
    @param[out] corners vector of the resulting corner points for drawing
*/
vector<Point3D>* computeBestFitPlane(const std::vector<Point3D>& points)
{
    Matrix M(3, 3);

    const Point3D center = computeCenter(points);
    computeCovarianceMatrix3x3(points, M);
    SVD::computeSymmetricEigenvectors(M);

    const Point3D ev0(M(0, 0), M(1, 0), M(2, 0)); //first column of M == Eigenvector corresponding to the largest Eigenvalue == direction of biggest variance
    const Point3D ev1(M(0, 1), M(1, 1), M(2, 1));
    const Point3D ev2(M(0, 2), M(1, 2), M(2, 2)); //third column of M == Eigenvector corresponding to the smallest Eigenvalue == direction of lowest variance

    //best-fit plane
    std::cout << "*** Best-fit plane ***\n";
    std::cout << "Point    : " << center.x << ", " << center.y << ", " << center.z << std::endl;
    std::cout << "Direction: " << ev2.x << ", " << ev2.y << ", " << ev2.z << std::endl;

    //computing the mean distance to plane
    double meanDistance = 0;
    for (size_t i = 0; i < points.size(); ++i)
    {
        meanDistance += std::abs(distancePt2Plane(points[i], center, ev2)); // calculate mean distance from any point in the cloud to center point on plane
    }
    meanDistance /= points.size();
    std::cout << "mean distance to plane: " << meanDistance << std::endl;

    //set default values for distances (positive and negative largest value of double)
    double mindist0 = +std::numeric_limits<double>::max();
    double maxdist0 = -std::numeric_limits<double>::max();
    double mindist1 = +std::numeric_limits<double>::max();
    double maxdist1 = -std::numeric_limits<double>::max();

    for (size_t i = 0; i < points.size(); ++i)
    {
        //compute new values for min- and maxdist0
        const double dist0 = distancePt2Plane(points[i], center, ev0); // dist from i to center on plane with direction ev0 (biggest variance)
        if (dist0 < mindist0) mindist0 = dist0;
        if (dist0 > maxdist0) maxdist0 = dist0;

        //compute new values for min- and maxdist1
        const double dist1 = distancePt2Plane(points[i], center, ev1); // dist from i to center on plane with direction ev1 (mean variance)
        if (dist1 < mindist1) mindist1 = dist1;
        if (dist1 > maxdist1) maxdist1 = dist1;
    }
    vector<Point3D>* drawPoints = new vector<Point3D>();
    // compute corner points of the bestFitPlane
    Point3D corner1 = center + ev0*maxdist0 + ev1*maxdist1;
    Point3D corner2 = center + ev0*maxdist0 + ev1*mindist1;
    Point3D corner3 = center + ev0*mindist0 + ev1*mindist1;
    Point3D corner4 = center + ev0*mindist0 + ev1*maxdist1;

    drawPoints->push_back(corner1);
    drawPoints->push_back(corner2);
    drawPoints->push_back(corner3);
    drawPoints->push_back(corner4);


    return drawPoints;

}
예제 #4
0
void kmeans::startClustering() {

	kcenter = new double[k];
	for(int i = 0; i < k; i++) kcenter[i] = 0;
	
	center = new average[k];
	for(int i = 0; i < k; i++) {
		center[i].setx(0);
		center[i].sety(0);
	}
	
	imageArray = new int*[numRow];
	for(int i = 0; i < numRow; ++i) {
    	imageArray[i] = new int[numCol];
	}
	
	for(int i = 0; i < numRow; i++) {
		for(int j = 0; j < numCol; j++) {
			imageArray[i][j] = 0;
		}
	}

	labelChecker = true;
		
	while (labelChecker) {
		labelChecker = false;
		computeCenter();
		computeDistance();	
	}

	listHead.putonImage(imageArray);	
	
}
예제 #5
0
ReturnFlag CPSOSubSwarm::evolve(){
	if(this->m_popsize<1) return Return_Normal;
	Solution<CodeVReal> t;
	ReturnFlag r_flag=Return_Normal;

	for(int i=0;i<this->m_popsize;i++){
		t=this->m_pop[i]->self();
		 bool flag=false;  
        r_flag=this->m_pop[i]->moveBound(this->m_pop[i]->m_pbest,this->getNearestBest(this->m_pop[i]->self()),m_W,m_C1,m_C2);//
			
		if(this->m_pop[i]->self()>this->m_pop[i]->m_pbest){
			this->m_pop[i]->m_pbest=this->m_pop[i]->self();
			flag=this->updateBestArchive(this->m_pop[i]->self());
		}

		if(r_flag!=Return_Normal) break;
		if(!flag&&this->m_pop[i]->self()>t){
			r_flag=updateBest(i,1.0);
		}
		if(r_flag!=Return_Normal)  {  break;}
		
	}
	if(r_flag==Return_Normal){
		this->m_evoNum++;
		double ratio=Global::msp_global->mp_problem->getEvaluations()%CAST_PROBLEM_DYN->getChangeFre()/static_cast<double>(CAST_PROBLEM_DYN->getChangeFre());
		m_W=m_maxW-(m_maxW-m_minW)*ratio;	
	}
	computeCenter();
	updateCurRadius(true);

	return r_flag;
}
예제 #6
0
파일: a5.cpp 프로젝트: hallfox/visual
void imKMeans(const cv::Mat& src, cv::Mat& dst) {
  cv::Mat res = src.clone();
  std::vector<uchar> centers[3];
  std::vector<cv::Point2i> groups[3] = {
    {cv::Point2i(0, 0)},
    {cv::Point2i(4, 0)},
    {cv::Point2i(8, 0)},
  };
  for (int i = 0; i < 3; i++) {
    centers[i] = computeCenter(src, groups[i]);
    // std::cout << "Initial groups: " << groups[i] << "\n";
  }
  for (int i = 0; i < src.rows/2; i+=4) {
    for (int j = 0; j < src.cols; j+=4) {
      if (i == 0 && j <= 8) {
        continue;
      }

      cv::Point2i loc(j, i);
      // std::cout << loc << "\n";
      double minDist = std::numeric_limits<double>::max();
      int nearest = 0;
      for (int k = 0; k < 3; k++) {
        double dist = euclidDistance(src, loc, centers[k], 4);
        if (dist < minDist) {
          minDist = dist;
          nearest = k;
        }
      }
      groups[nearest].push_back(loc);
      // std::cout << "Updated group " << nearest << " " << groups[nearest] << std::endl;
      centers[nearest] = computeCenter(src, groups[nearest]);
      switch(nearest) {
      case 0:
        maskFill(res, j, i, 4, 0);
        break;
      case 1:
        maskFill(res, j, i, 4, 128);
        break;
      case 2:
        maskFill(res, j, i, 4, 255);
        break;
      }
    }
  }
  dst = res;
}
예제 #7
0
파일: Mesh.cpp 프로젝트: higerra/Render
void Mesh::ReadMesh(istream& strm, int camNums)
{
	int vertex_numbers, face_numbers, Joint_number, weights_number;
	strm>>vertex_numbers>>face_numbers>>Joint_number>>weights_number;

	// vertexes and weights
	double x,y,z;
	
	vertices.resize(vertex_numbers);
	for(int i=0;i<vertex_numbers;i++) {
		strm>>x>>y>>z;
		vertices[i].pos = Vector3f(x,y,z);
		vertices[i].weight.resize(Joint_number+1,.0);
		for(int j=0;j<weights_number;j++) {
			int index;
			double w;
			strm>>index>>w;
			vertices[i].weight[index] = w;
		}

		// color
		vertices[i].color[0] = 0.f;
		vertices[i].color[1] = 0.f;
		vertices[i].color[2] = 0.f;

		vertices[i].texture.resize(camNums*20);
	}

	// faces
	int index_v1,index_v2,index_v3;
	for(int i=0;i<face_numbers;i++)	{
		int first = (int)edges.size();
		strm>>index_v1>>index_v2>>index_v3;
		edges.resize(edges.size() + 3);
		edges[first + 0].vertex = index_v1;
		edges[first + 1].vertex = index_v2;
		edges[first + 2].vertex = index_v3;	

		edges[first + 0].prev = index_v3;
		edges[first + 1].prev = index_v1;
		edges[first + 2].prev = index_v2;

		vertices[index_v1].edges.push_back(first);
		vertices[index_v2].edges.push_back(first);
		vertices[index_v3].edges.push_back(first);
	}

	//skeleton
	skeleton.resize(Joint_number);
	for(int i=0;i<Joint_number;i++)
		strm>>skeleton[i].curr>>skeleton[i].norm[0]>>skeleton[i].norm[1]>>skeleton[i].norm[2]>>
			skeleton[i].pos[0]>>skeleton[i].pos[1]>>skeleton[i].pos[2]>>skeleton[i].prev;

	computeCenter();
	computeBBox();
	return;
}
예제 #8
0
void ConfigStat::compute() {

    deleteComputation();
    initComputation();

    computeDistanceMatrix();
    computeCenter();
    computeCentroid();
    computeBetweennessCenter();
}
예제 #9
0
void StarShape::setSize(const QSizeF &newSize)
{
    QTransform matrix(resizeMatrix(newSize));
    m_zoomX *= matrix.m11();
    m_zoomY *= matrix.m22();

    // this transforms the handles
    KoParameterShape::setSize(newSize);

    m_center = computeCenter();
}
예제 #10
0
void KoStarShape::updatePath( const QSizeF &size )
{
    Q_UNUSED(size);
    qreal radianStep = M_PI / static_cast<qreal>(m_cornerCount);

    createPoints( m_convex ? m_cornerCount : 2*m_cornerCount );

    KoSubpath &points = *m_subpaths[0];

    uint index = 0;
    for( uint i = 0; i < 2*m_cornerCount; ++i )
    {
        uint cornerType = i % 2;
        if( cornerType == base && m_convex )
            continue;
        qreal radian = static_cast<qreal>( (i+1)*radianStep ) + m_angles[cornerType];
        QPointF cornerPoint = QPointF( m_zoomX * m_radius[cornerType] * cos( radian ), m_zoomY * m_radius[cornerType] * sin( radian ) );

        points[index]->setPoint( m_center + cornerPoint );
        points[index]->unsetProperty( KoPathPoint::StopSubpath );
        points[index]->unsetProperty( KoPathPoint::CloseSubpath );
        if( m_roundness[cornerType] > 1e-10 || m_roundness[cornerType] < -1e-10 )
        {
            // normalized cross product to compute tangential vector for handle point
            QPointF tangentVector( cornerPoint.y()/m_radius[cornerType], -cornerPoint.x()/m_radius[cornerType] );
            points[index]->setControlPoint2( points[index]->point() - m_roundness[cornerType] * tangentVector );
            points[index]->setControlPoint1( points[index]->point() + m_roundness[cornerType] * tangentVector );
        }
        else
        {
            points[index]->removeControlPoint1();
            points[index]->removeControlPoint2();
        }
        index++;
    }

    // first path starts and closes path
    points[0]->setProperty( KoPathPoint::StartSubpath );
    points[0]->setProperty( KoPathPoint::CloseSubpath );
    // last point stops and closes path
    points.last()->setProperty( KoPathPoint::StopSubpath );
    points.last()->setProperty( KoPathPoint::CloseSubpath );

    normalize();

    m_handles.clear();
    m_handles.push_back( points.at(tip)->point() );
    if( ! m_convex )
        m_handles.push_back( points.at(base)->point() );

    m_center = computeCenter();
}
예제 #11
0
파일: Mesh.cpp 프로젝트: higerra/Render
void Mesh::ReadOff(istream& strm,int camNums)
{
	string tmp;
	strm>>tmp;
	
	/*if(strcmp(tmp.c_str(),"COFF"));
	{
		cout<<".off file has been wrong, please check your file!"<<endl;
		return;
	}*/

	int vertex_numbers, face_numbers, tmp_number;
	strm>>vertex_numbers>>face_numbers>>tmp_number;

	double x,y,z;
	float r,g,b,a;
	for(int i=0;i<vertex_numbers;i++)	
	{
		strm>>x>>y>>z>>r>>g>>b>>a;
		vertices.resize(vertices.size() + 1);
		vertices.back().pos = Vector3f(x,y,z);
		vertices.back().color = Vector3f(r,g,b);
		vertices[i].texture.resize(camNums*20);
	}

	int index_v1,index_v2,index_v3;
	for(int i=0;i<face_numbers;i++)
	{
		int first = (int)edges.size();
		strm>>tmp_number>>index_v1>>index_v2>>index_v3;
		edges.resize(edges.size() + 3);
		edges[first + 0].vertex = index_v1;
		edges[first + 1].vertex = index_v2;
		edges[first + 2].vertex = index_v3;	
		
		edges[first + 0].prev = index_v3;
		edges[first + 1].prev = index_v1;
		edges[first + 2].prev = index_v2;

		vertices[index_v1].edges.push_back(first);
		vertices[index_v2].edges.push_back(first);
		vertices[index_v3].edges.push_back(first);
	}

	skeleton.clear();

	computeCenter();
	computeBBox();
	return;
}
예제 #12
0
/** @brief computes best-fit approximations.
    @param[in] points   vector of points
    @param[out] corners vector of the resulting corner/end points for drawing
*/
vector<Point3D>* computeBestFitLine(const std::vector<Point3D>& points)
{
    Matrix M(3, 3);
    const Point3D center = computeCenter(points);
    computeCovarianceMatrix3x3(points, M);
    SVD::computeSymmetricEigenvectors(M);

    const Point3D ev0(M(0, 0), M(1, 0), M(2, 0)); //first column of M == Eigenvector corresponding to the largest Eigenvalue == direction of biggest variance
    const Point3D ev1(M(0, 1), M(1, 1), M(2, 1));
    const Point3D ev2(M(0, 2), M(1, 2), M(2, 2)); //third column of M == Eigenvector corresponding to the smallest Eigenvalue == direction of lowest variance

    //best-fit line
    std::cout << "*** Best-fit line ***\n";
    std::cout << "Point    : " << center.x << ", " << center.y << ", " << center.z << std::endl;
    std::cout << "Direction: " << ev0.x << ", " << ev0.y << ", " << ev0.z << std::endl;

    //computing the mean distance to line
    double meanDistance = 0;
    for (size_t i = 0; i < points.size(); ++i)
    {
        meanDistance += distancePt2Line(points[i], center, ev0);
    }
    meanDistance /= points.size();
    std::cout << "mean distance to line: " << meanDistance << std::endl;

    //Compute the end points of the line
    double mindist = +std::numeric_limits<double>::max();
    double maxdist = -std::numeric_limits<double>::max();
    for (size_t i = 0; i < points.size(); ++i)
    {
        //compute distance for each point
        const double dist = distancePt2Plane(points[i], center, ev0);
        if (dist < mindist) mindist = dist;
        if (dist > maxdist) maxdist = dist;
    }

    vector<Point3D>* drawPoints = new vector<Point3D>();
    //compute new corner points
    Point3D corner1 = center + ev0*mindist;
    Point3D corner2 = center + ev0*maxdist;

    drawPoints->push_back(corner1);
    drawPoints->push_back(corner2);


    return drawPoints;
}
예제 #13
0
void GestureRecognizer::updatePinchData(double timestamp, const NIXTouchEvent& event)
{
    assert(m_initialPinchScale > 0);

    const NIXTouchPoint& first = event.touchPoints[0];
    const NIXTouchPoint& second = event.touchPoints[1];

    WKPoint currentCenter = computeCenter(WKPointMake(first.globalX, first.globalY), WKPointMake(second.globalX, second.globalY));
    WKPoint delta = WKPointMake((currentCenter.x - m_previousPinchGlobalCenter.x) / m_client->scale(),
                                (currentCenter.y - m_previousPinchGlobalCenter.y) / m_client->scale());
    double currentDistance = computeDistance(WKPointMake(first.globalX, first.globalY), WKPointMake(second.globalX, second.globalY));
    double newScale = m_initialPinchScale * (currentDistance / m_initialPinchDistance);

    m_client->handlePinch(timestamp, delta, newScale, m_initialPinchContentCenter);

    m_previousPinchGlobalCenter = currentCenter;
}
예제 #14
0
void computeCoarianceMatrix(const std::vector<Point3D> &points, Matrix &M) {
    M.resize(3, 3);
    const ptrdiff_t N(points.size());
    if (N < 1) return;

    //compute the mean value (center) of the points cloud
    Point3D mean = computeCenter(points);

    //Compute the entries of the (symmetric) covariance matrix
    double Mxx(0), Mxy(0), Mxz(0), Myy(0), Myz(0), Mzz(0);
#pragma omp parallel for reduction(+: Mxx,Mxy,Mxz,Myy,Myz,Mzz) //omp reduction enables parallel sum up of values
    for (ptrdiff_t i = 0; i < N; ++i) {
        const Point3D &pt = points[i];

        //generate mean-free coorinates
        const double x1(pt.x - mean.x);
        const double y1(pt.y - mean.y);
        const double z1(pt.z - mean.z);

        //Sum up the entries for the covariance matrix
        Mxx += x1 * x1;
        Mxy += x1 * y1;
        Mxz += x1 * z1;
        Myy += y1 * y1;
        Myz += y1 * z1;
        Mzz += z1 * z1;

    }

    //setting the sums to the matrix (division by N just for numerical reason if we have very large sums)
    M(0, 0) = Mxx / N;
    M(0, 1) = Mxy / N;
    M(0, 2) = Mxz / N;
    M(1, 0) = M(0, 1);
    M(1, 1) = Myy / N;
    M(1, 2) = Myz / N;
    M(2, 0) = M(0, 2);
    M(2, 1) = M(1, 2);
    M(2, 2) = Mzz / N;

    for(int i=0; i<9; ++i)
        printf("%lf\n",M[i] );

}
예제 #15
0
/******************************************************************//**
 * Initializing protein class
 ******************************************************************/
CProtein::CProtein(const char *fname) {
	vector<AA> aas;
	string ss = fname;

	if (ss.find("pdb") != std::string::npos) {
		CPDB::loadFromPDB(fname, aas);
	} else if (ss.find("pqr") != std::string::npos) {
		CPDB::loadFromPQR(fname, aas);
	}

	// Add each atom in each amino acid of protein to matrix of atoms
	for (int i = 0; i < aas.size(); i++)
		for (int j = 0; j < aas[i].getNumAtoms(); j++)
			m_atoms.push_back(aas[i][j]);

	// Add charge on atom in each amino acid to vector of charges
	for (int i = 0; i < m_atoms.size(); i++) {
		if (m_atoms[i].getCharge() != 0.0)
			m_chargedAtoms.push_back(&(m_atoms[i]));
	}

	m_center = computeCenter(); // compute center of geometry if the atom
	// reposition each atom WRT to the center of mass of protein
	for (int i = 0; i < m_atoms.size(); i++)
		m_atoms[i].setPos(m_atoms[i].getPos() - m_center);

	computeRadius();

	m_sumCharge = 0.0; // Total charge of protein
	for (int i = 0; i < getNumCharges(); i++) m_sumCharge += getCharge(i);

	REAL s = 0.0; // Total charge of protein to print as output
	for (int i = 0; i < getNumCharges(); i++) s += (getCharge(i));
	cout << "sum = " << s << " rad = " << m_rad << endl;

	// Creating a multipole expansion class for the protein
	m_mpe = new CMPE(*this);

	m_exps.push_back(m_mpe); // Pushing the MPE to an array
	// Adding the protein center to an array of centers
	m_cens.push_back(&m_center);
	m_mols.push_back(this); // Adding the protein to an array of proteins
}
예제 #16
0
ReturnFlag NFishSwarm::evolve(){
	ReturnFlag rf=Return_Normal;
	//new prey behavior
	for(auto &fish:m_pop){
		for(int i=0;i<m_tryNumber;++i){
			rf=fish->prey(m_visual);
			if(rf!=Return_Normal) return rf;
			updateBestArchive(fish->self());
		}
	}
	
	//new follow behavior
	for(auto &fish:m_pop){
		rf=fish->follow(*m_best[0],m_visual);
		if(rf!=Return_Normal) return rf;
		updateBestArchive(fish->self());
	}

	//new swarm behevior
	computeCenter();
	findBest();
	for(auto &fish:m_pop){
		if(m_center>fish->self()){
			if(fish->m_index!=m_bestIdx[0]){
				rf=fish->swarm(m_center,m_visual);
				if(rf!=Return_Normal) return rf;
			}else{
				fish->self()=m_center;	
			}
			updateBestArchive(fish->self());
		}
	}
	updateVisual();
	updateCurRadius();
	m_iter++;
	return rf;
}
예제 #17
0
int main(int argc, char *argv[]) {
	// Check command arguments
	int c;
	int DEVICE, SEGMENTATION_RATIO, OFFSET, ANGLE, THRESHOLD, RESOLUTION;
	while ((c = getopt(argc, argv, "v:s:o:a:t:r:")) != -1) {
		switch (c) {
			case 'v':
				DEVICE = atoi(optarg);
				break;
			case 's':
				SEGMENTATION_RATIO = atoi(optarg);
				break;
			case 'o':
				OFFSET = atoi(optarg);
				break;
			case 'a':
				ANGLE = atoi(optarg);
				break;
			case 't':
				THRESHOLD = atoi(optarg);
				break;
			case 'r':
				RESOLUTION = atoi(optarg);
				break;
			default: // '?'
				std::cout << "Usage: " << argv[0] << " [-v device] [-s segmentation_ratio] [-o offset] [-a angle] [-t threshold] [-r resolution]" << std::endl;
				return -1;
		}
	}
	if (argc != 13) {
		std::cout << "Usage: " << argv[0] << " [-v device] [-s segmentation_ratio] [-o offset] [-a angle] [-t threshold] [-r resolution]" << std::endl;
		return -1;
	}

	/*ROS*/
	r_init( Road_Detecter);
	r_hdlr( hdl);
	r_newPub( pubRoad, hdl, challenge1::road, Road, 1000);
	ros::Rate loop_rate(10);

	challenge1::road rd;
	/**/

	cv::VideoCapture myVideoCapture(DEVICE);
	if (!myVideoCapture.isOpened()) {
		std::cout << "ERROR: Cannot open device " << DEVICE << std::endl;
		return -1;
	}

	cv::namedWindow("Video Captured");
	cv::namedWindow("Road Detected");

	int imgCenter = myVideoCapture.get(CV_CAP_PROP_FRAME_WIDTH) / 2;
	int preCenter = imgCenter;
	int movingDirection = GO_STRAIGHT;
	//while (1) {
	while( ros::ok()){
		int key = cv::waitKey(1);
		if ((key & 0xFF) == 27) // 'Esc' key
			return 0;

		cv::Mat inputFrame, segmentedInputFrame;
		myVideoCapture >> inputFrame;
		inputFrame(cv::Range(inputFrame.rows - inputFrame.rows / SEGMENTATION_RATIO, inputFrame.rows - 1), cv::Range::all()).copyTo(segmentedInputFrame);

		// Detect road. In general, there are only vertical lines
		cv::Mat road = detectRoad(segmentedInputFrame, OFFSET, ANGLE);

		// Compute the road center
		int curCenter = computeCenter(road);

		// Compute the moving direction
		movingDirection = computeMovingDirection(imgCenter, preCenter, curCenter, movingDirection, THRESHOLD, RESOLUTION);
		std::cout << movingDirection << std::endl;

		cv::imshow("Video Captured", segmentedInputFrame);
		cv::imshow("Road Detected", road);

		/*ROS*/
		/*switch( movingDirection){
			case GO_STRAIGHT:
			case TURN_LEFT:
			case TURN_RIGHT:
			default:
				break;
		}*/
		rd.direction = movingDirection;

		pubRoad.publish( rd);
		ros::spinOnce();
		loop_rate.sleep();
		/*\ROS*/
	}

	return 0;
}
예제 #18
0
void BoundingPolyhedron::addPoint(Vec3f *point) {
    points.push_back(point);
    computeCenter();
}
예제 #19
0
/** @brief computes best-fit approximations.
@param points vector of points
*/
vector<Point3D>* computeBestFits(const std::vector<Point3D> &points) {
    Matrix M(3, 3);

    const Point3D center = computeCenter(points);
    computeCovarianceMatrix3x3(points, M);
    SVD::computeSymmetricEigenvectors(M);

    const Point3D ev0(M(0, 0), M(1, 0), M(2,
                                          0)); //first column of M == Eigenvector corresponding to the largest Eigenvalue == direction of biggest variance
    const Point3D ev1(M(0, 1), M(1, 1), M(2, 1));
    const Point3D ev2(M(0, 2), M(1, 2), M(2,
                                          2)); //third column of M == Eigenvector corresponding to the smallest Eigenvalue == direction of lowest variance

    //best-fit line
    std::cout << "*** Best-fit line ***\n";
    std::cout << "Point    : " << center.x << ", " << center.y << ", " << center.z << std::endl;
    std::cout << "Direction: " << ev0.x << ", " << ev0.y << ", " << ev0.z << std::endl;

    //computing the mean distance to line
    double meanDistance = 0;
    for (size_t i = 0; i < points.size(); ++i) {
        meanDistance += distancePt2Line(points[i], center, ev0);
    }
    meanDistance /= points.size();
    std::cout << "mean distance to line: " << meanDistance << std::endl;


    std::cout << "\n";
    //best-fit plane
    std::cout << "*** Best-fit plane ***\n";
    std::cout << "Point    : " << center.x << ", " << center.y << ", " << center.z << std::endl;
    std::cout << "Direction: " << ev2.x << ", " << ev2.y << ", " << ev2.z << std::endl;

    //computing the mean distance to line
    meanDistance = 0;
    for (size_t i = 0; i < points.size(); ++i) {
        meanDistance += std::abs(distancePt2Plane(points[i], center, ev2));
    }
    meanDistance /= points.size();
    std::cout << "mean distance to plane: " << meanDistance << std::endl;


    double param = .1;
    double param2 = 1.0;
    //We just calculate midlepoint
    Point3D*  midlepoint1;
    Point3D*  midlepoint2;
    midlepoint1 = midpoint2(center - ev1*param,center - ev0*param);
    midlepoint2 = midpoint2(center + ev1*param,center + ev0*param);

    vector<Point3D>* drawPoints = new vector<Point3D>();
    /*
    drawPoints->push_back(center + ev1*param);
    drawPoints->push_back(center - ev1*param);
     drawPoints->push_back(center + ev0*param);
    drawPoints->push_back(center - ev0*param);
   */
    ///////////////////////////////////////
    Point3D  midlepoint11;
    Point3D  midlepoint22;
    midlepoint11.x = midlepoint1->x;
    midlepoint11.y = midlepoint1->y;
    midlepoint11.z = midlepoint1->z;
    midlepoint22.x = midlepoint2->x;
    midlepoint22.y = midlepoint2->y;
    midlepoint22.z = midlepoint2->z;

    ///////////////////////////////////////

    drawPoints->push_back(center-(center + ev2*param));
    drawPoints->push_back(center+(center + ev2*param));
    drawPoints->push_back(center-(center + ev0*param));
    drawPoints->push_back(center+(center + ev0*param));

    //drawPoints->push_back(center + ev2*param);
    //drawPoints->push_back(center - ev2*param);

    return drawPoints;

}