docs: public void addImage(T image , String cameraName ) {
  
  		PairwiseImageGraph.View view = new PairwiseImageGraph.View(graph.nodes.size(),
  				new FastQueue<TupleDesc>(TupleDesc.class,true) {
  					@Override
  					protected TupleDesc createInstance() {
  						return detDesc.createDescription();
  					}
  				});
  
  		view.camera = graph.cameras.get(cameraName);
  		if( view.camera == null )
  			throw new IllegalArgumentException("Must have added the camera first");
  
  		view.index = graph.nodes.size();
  		graph.nodes.add(view);
  
  		detDesc.detect(image);
  
  		// Pre-declare memory
  		view.descriptions.growArray(detDesc.getNumberOfFeatures());
  		view.observationPixels.growArray(detDesc.getNumberOfFeatures());
  
  		for (int i = 0; i < detDesc.getNumberOfFeatures(); i++) {
  			Point2D_F64 p = detDesc.getLocation(i);
  
  			// save copies since detDesc recycles memory
  			view.descriptions.grow().setTo(detDesc.getDescription(i));
  			view.observationPixels.grow().set(p);
  		}
  
  		if( view.camera.pixelToNorm == null ){
  			return;
  		}
  
  		view.observationNorm.growArray(detDesc.getNumberOfFeatures());
  		for (int i = 0; i < view.observationPixels.size; i++) {
  			Point2D_F64 p = view.observationPixels.get(i);
  			view.camera.pixelToNorm.compute(p.x,p.y,view.observationNorm.grow());
  		}
  
  		if( verbose != null ) {
  			verbose.println("Detected Features: "+detDesc.getNumberOfFeatures());
  		}
  	}