void Panorama::create_matchs()
{
	KDTree kd;
	Node *nodes = new Node[features.size()];
	kd.KDTree_build(nodes, &(featureData[0]), features.size(), 128);

	int *numMatchOf_i = new int[images.size()]();

#define _K 4
	int max_match = min(_K, (int)images.size()-1);
	for (int i = 0; i < features.size(); ++i) {
		int *target = &featureData[128*i];
		int indice[_K];
		kd.find_kNN(indice, target, max_match, i);
		for (int j = 0; j < max_match; ++j) {
			int iMatch = indice[j];
			Feature f1 = features[i];
			Feature f2 = features[iMatch];
			if (f1.iid != f2.iid) {
				MatchPair match = {f1, f2};
				matchs.push_back(match);
				++(numMatchOf_i[f1.iid]);
			}
		}
#undef _K
	}

	vector<MatchPair>::iterator op = matchs.begin();
	vector<MatchPair>::iterator ed = matchs.begin();
	for (int i = 0; i < imageNames.size(); ++i) {
		op = ed;
		ed += numMatchOf_i[i];
		sort(op, ed, compare_match);
	}
	create_match_info();

	FILE *fp = fopen("matchs_0.txt", "w");
	print_matchs(fp, matchs);
	fclose(fp);

	fp = fopen("imatchs_0.txt", "w");
	print_imatchs(fp, imageMatchInfos);
	fclose(fp);
	delete[] numMatchOf_i;

	// featureData is not needed anymore, it is very large, so free its memory
	// Note: clear() will not free the memory
	vector<int> emptyVec(0);
	emptyVec.swap(featureData);
	delete[] nodes;
}
Beispiel #2
0
	void xform_test_object_t::test<1>()
	{
		LLXform xform_obj;
		LLVector3 emptyVec(0.f,0.f,0.f);
		LLVector3 initialScaleVec(1.f,1.f,1.f);

		ensure("LLXform empty constructor failed: ", !xform_obj.getParent() && !xform_obj.isChanged() &&
			xform_obj.getPosition() == emptyVec && 
			(xform_obj.getRotation()).isIdentity() &&
			xform_obj.getScale() == initialScaleVec && 
			xform_obj.getPositionW() == emptyVec && 
			(xform_obj.getWorldRotation()).isIdentity() &&
			!xform_obj.getScaleChildOffset());
	}