Exemple #1
0
int SingleSLAM::newMapPoints(std::vector<MapPoint*>& mapPts, double maxEpiErr,
		double maxNcc) {
	std::vector<FeaturePoint*> vecFeatPts;
	getUnMappedAndTrackedFeatPts(vecFeatPts, 0, Param::nMinFeatTrkLen);

	mapPts.clear();
	mapPts.reserve(4096);

	double M[3], m1[2], m2[2];

	//reconstruct 3D map points
	int numRecons = 0;
	for (size_t k = 0; k < vecFeatPts.size(); k++) {
		FeaturePoint* cur_fp = vecFeatPts[k];
		FeaturePoint* pre_fp = cur_fp;
		while (pre_fp->preFrame && pre_fp->preFrame->cam) {
			if (pre_fp->type == TYPE_FEATPOINT_DYNAMIC) {
				break;
			}
			pre_fp = pre_fp->preFrame;
		}
		if (pre_fp->type == TYPE_FEATPOINT_DYNAMIC || !pre_fp->cam)
			continue;

		normPoint(iK.data, pre_fp->m, m1);
		normPoint(iK.data, cur_fp->m, m2);

		//triangulate the two feature points to get the 3D point
		binTriangulate(pre_fp->cam->R, pre_fp->cam->t, cur_fp->cam->R,
				cur_fp->cam->t, m1, m2, M);

		if (isAtCameraBack(cur_fp->cam->R, cur_fp->cam->t, M))
			continue;

		double cov[9], org[3];
		getBinTriangulateCovMat(K.data, pre_fp->cam->R, pre_fp->cam->t, K.data,
				cur_fp->cam->R, cur_fp->cam->t, M, cov, Const::PIXEL_ERR_VAR);
		getCameraCenter(cur_fp->cam->R, cur_fp->cam->t, org);
		double s = fabs(cov[0] + cov[4] + cov[8]);
		if (dist3(org, M) < sqrt(s))
			continue;

		//check the reprojection error
		double err1 = reprojErrorSingle(K.data, pre_fp->cam->R, pre_fp->cam->t,
				M, pre_fp->m);
		double err2 = reprojErrorSingle(K.data, cur_fp->cam->R, cur_fp->cam->t,
				M, cur_fp->m);

		if (err1 < maxEpiErr && err2 < maxEpiErr) {
			//a new map point is generated
			refineTriangulation(cur_fp, M, cov);
			err1 = reprojErrorSingle(K.data, pre_fp->cam->R, pre_fp->cam->t, M,
					pre_fp->m);
			err2 = reprojErrorSingle(K.data, cur_fp->cam->R, cur_fp->cam->t, M,
					cur_fp->m);
			if (isAtCameraBack(cur_fp->cam->R, cur_fp->cam->t, M)
					|| isAtCameraBack(pre_fp->cam->R, pre_fp->cam->t, M))
				continue;
			if (err1 < maxEpiErr && err2 < maxEpiErr) {
				MapPoint* pM = new MapPoint(M[0], M[1], M[2], pre_fp->f);
				doubleArrCopy(pM->cov, 0, cov, 9);
				mapPts.push_back(pM);
				pM->lastFrame = cur_fp->f;
				for (FeaturePoint* p = cur_fp; p; p = p->preFrame)
					p->mpt = pM;

				//add the feature point
				pM->addFeature(camId, cur_fp);
				pM->setLocalStatic();

				//compute the NCC block
				pM->nccBlks[camId].computeScaled(m_lastKeyPos->imgSmall,
						m_lastKeyPos->imgScale, cur_fp->x, cur_fp->y);

				int x = max(0, min((int) cur_fp->x, m_rgb.w - 1));
				int y = max(0, min((int) cur_fp->y, m_rgb.h - 1));
				pM->setColor(m_rgb(x, y));
				numRecons++;
			}
		}
	}
	return numRecons;
}
void GLImagePane::mouseDown(wxMouseEvent& event) {
	int x = event.GetX();
	int y = event.GetY();

	double fm[2] = { imgWidth * x * 1.0 / getWidth(), imgHeight * y * 1.0
			/ getHeight() };
	FeaturePoint* pFeatPt = searchNearestFeatPt(
			m_pSLAM->slam[m_camId].m_featPts, m_pSLAM->curFrame, fm, 7.0);
	if (pFeatPt) {
		s_clicked_camid = m_camId;
		s_clicked_featPt = pFeatPt;
		s_clicked_mappt = pFeatPt->mpt;
		if (pFeatPt->mpt && pFeatPt->mpt->state == STATE_MAPPOINT_CURRENT) {
			replaceMapPointFlag(m_pSLAM->curMapPts, FLAG_MAPPOINT_TEST4,
					FLAG_MAPPOINT_NORMAL);
			pFeatPt->mpt->flag = FLAG_MAPPOINT_TEST4;
			//		//test
			pFeatPt->mpt->print();
			double M[3], cov[9];
			//		isDynamicPoint(2,pFeatPt->mpt,2.0,M,cov);

			//print reprojection errors
			MapPoint* p = pFeatPt->mpt;
			logInfo("newpt : %s\n", p->bNewPt ? "yes" : "no");
			for (int i = 0; i < SLAM_MAX_NUM; i++) {
				FeaturePoint* fp = p->pFeatures[i];
				if (fp) {
					CamPoseItem* cam = fp->cam;
					double err = reprojErrorSingle(m_pSLAM->slam[i].K.data,
							cam->R, cam->t, p->M, fp->m);
					logInfo("[view#%d]error:%lf  ", i, err);
					double rm[2], var[4], ivar[4];

					project(fp->K, fp->cam->R, fp->cam->t, p->M, rm);
					getProjectionCovMat(fp->K, fp->cam->R, fp->cam->t, p->M,
							p->cov, var, Const::PIXEL_ERR_VAR);
					mat22Inv(var, ivar);

					double err2 = mahaDist2(rm, fp->m, ivar);
					logInfo("maha error:%lf\n", err2);

					printMat(3, 3, cam->R);
					printMat(3, 1, cam->t);

					logInfo(
							"is at the cam#%d's back : '%s'\n----------------------------------------\n",
							i,
							isAtCameraBack(cam->R, cam->t, p->M) ?
									"yes" : "no");
					//get the number of previous frames
					//				int num = 0;
					//				while (fp != 0) {
					//					num++;
					//					fp = fp->preFrame;
					//				}
					//				logInfo("[%d]number :%d\n", i, num);
				}
			}
			if (isStaticPoint(m_pSLAM->numCams, p, 6.0, M, cov, 10)) {
				//test
				printf("static\n");
			}
			if (isDynamicPoint(m_pSLAM->numCams, p, 6.0, M, cov)) {
				//test
				printf("dynamic\n");
			}

			printf("static frame num:%d\n", p->staticFrameNum);
			//test map registration
			//			Mat_d camDist;
			//			m_pSLAM->getCurrentCamDist(camDist);
			//			MyApp::bDebug = true;
			//			int groupId = m_pSLAM->m_groupId[m_camId];
			//			bool bReg = m_pSLAM->currentStaticPointRegisterInGroup(m_pSLAM->m_groups[groupId], camDist, pFeatPt->mpt,
			//					10.0);
			//			logInfo("register:%d\n", bReg ? 1 : 0);
			MyApp::redrawViews();
		}
		MyApp::redrawViews();
	} else {
		s_clicked_camid = -1;
		s_clicked_featPt = 0;
		s_clicked_mappt = 0;
	}
}