//get the edge with max probability and then create initialize the hessian
//memory if the nodes have changed
void EdgeSE2PointXYMixture::computeError()
{
  int best = -1;
  double minError = numeric_limits<double>::max();
  for(unsigned int i=0;i<numberComponents;i++){
    //allEdges[i]->computeError();
    double thisNegLogProb = getNegLogProb(i);
    if(minError>thisNegLogProb){
      best = i;
      minError = thisNegLogProb;
    }
  }

  //if(best!=bestComponent){
    bestComponent = best;
    UpdateBelief(bestComponent);
  //}
  g2o::EdgeSE2PointXY::computeError();
}
예제 #2
0
static cv::Mat RunLoopyBPOnGrideGraph(std::string rootFolder, MCImg<float> &unaryCosts, cv::Mat &imL)
{
	struct LoopyBPOnGridGraphEvalParams {
		MCImg<float> *allMessages;
		MCImg<float> *allBeliefs;
		MCImg<float> *unaryCosts;
		LoopyBPOnGridGraphEvalParams() : allMessages(0), allBeliefs(0), unaryCosts(0) {}
	};

	int numRows = unaryCosts.h, numCols = unaryCosts.w, numDisps = unaryCosts.n;
	std::vector<cv::Point2i> pixelList(numRows * numCols);
	for (int y = 0, id = 0; y < numRows; y++) {
		for (int x = 0; x < numCols; x++, id++) {
			pixelList[id] = cv::Point2i(x, y);
		}
	}
	
	MCImg<float> oldMessages(numRows, numCols, 4 * numDisps);
	MCImg<float> newMessages(numRows, numCols, 4 * numDisps);
	MCImg<float> allBeliefs(numRows, numCols, numDisps);

	// Step 1 - Initialize messages
	memset(oldMessages.data, 0, 4 * numRows * numCols * numDisps * sizeof(float));
	memset(newMessages.data, 0, 4 * numRows * numCols * numDisps * sizeof(float));
	for (int i = 0; i < numRows * numCols * numDisps; i++) {
		allBeliefs.data[i] = 1.f / numDisps;
	}

	// Step 2 - Update messages
	float maxBeliefDiff = FLT_MAX;
	const int maxBPRound = 100;
	for (int round = 0; round < maxBPRound && maxBeliefDiff > 1e-7; round++) {
		int tic = clock();
		if (round % 1 == 0) {
			cv::Mat dispMap = DecodeDisparityFromBeliefs(allBeliefs);
			
			//std::vector<std::pair<std::string, void*>> auxParams;
			//auxParams.push_back(std::pair<std::string, void*>("allMessages", &oldMessages));
			//auxParams.push_back(std::pair<std::string, void*>("allBeliefs",  &allBeliefs));
			//auxParams.push_back(std::pair<std::string, void*>("unaryCosts",   &unaryCosts));
			//EvaluateDisparity(rootFolder, dispMap, 1.f, auxParams, "OnMouseLoopyBPOnGridGraph");

			LoopyBPOnGridGraphEvalParams evalParams;
			evalParams.allMessages = &oldMessages;
			evalParams.allBeliefs  = &allBeliefs;
			evalParams.unaryCosts  = &unaryCosts;
			EvaluateDisparity(rootFolder, dispMap, 1.f, &evalParams, "OnMouseLoopyBPOnGridGraph");
		}


		printf("Doing round %d ...\n", round);
		std::random_shuffle(pixelList.begin(), pixelList.end());
		//printf("pixelList.size() = %d\n", pixelList.size());
		//printf("numDisps = %d\n", numDisps);
		int numPixels = pixelList.size();

		// update messages
		#pragma omp parallel for
		for (int i = 0; i < numPixels; i++) {
			if (i % 1000 == 0) {
				//printf("i = %d\n", i);
			}

			cv::Point2i s = pixelList[i];
			for (int k = 0; k < 4; k++) {
				cv::Point2i t = s + dirDelta[k];
				
				UpdateMessage(s, t, oldMessages, newMessages, unaryCosts, imL);
				
			}
		}
		memcpy(oldMessages.data, newMessages.data, 4 * numRows * numCols * numDisps * sizeof(float));

		// update beliefs
		maxBeliefDiff = -1;
		for (int i = 0; i < pixelList.size(); i++) {
			cv::Point2i t = pixelList[i];
			float maxDiff = UpdateBelief(t, allBeliefs, oldMessages, unaryCosts);
			maxBeliefDiff = std::max(maxBeliefDiff, maxDiff);
		}
		printf("maxBeliefDiff = %f\n", maxBeliefDiff);
		printf("%.2fs\n", (clock() - tic) / 1000.f);

		cv::Mat dispMap = DecodeDisparityFromBeliefs(allBeliefs);
		cv::cvtColor(dispMap, dispMap, CV_GRAY2BGR);
		int maxDisp, visualizeScale;
		SetupStereoParameters(rootFolder, numDisps, maxDisp, visualizeScale);
		dispMap.convertTo(dispMap, CV_8UC3, visualizeScale);
		char filePath[1024];
		sprintf(filePath, "d:/data/tmpResults/iter=%d.png", round);
		cv::imwrite(filePath, dispMap);
	}


	// Step 3 - Collect Beliefs
	cv::Mat dispMap = DecodeDisparityFromBeliefs(allBeliefs);
	EvaluateDisparity(rootFolder, dispMap);
	return dispMap;
}