bool HoughLine::adjust(EdgeList& edges, const AdjustParams& p, bool capture) { float uHistogram[UHistSize]; LineFit fit; if (capture) for (int i = 0; i < UHistSize; ++i) uHistogram[i] = 0; int lineAngle = binaryAngle(); // The angle range to consider is derived from the angle fuzzy threshold int angleLimit = (int)ceil(p.angleThr.t1() * 128 / M_PI); members = 0; // Consider all edges at an angle similar to this line for (int bin = lineAngle - angleLimit; bin <= lineAngle + angleLimit; ++bin) for (Edge* e = edges.binList(bin); e; e = e->next()) if (!e->memberOf()) { float angle = (float)diffRadians(e->radians(), t()); double x = e->x(); double y = e->y(); float distance = (float)fabs(pDist(x, y)); float w = (angle < p.angleThr & distance < p.distanceThr & (float)e->mag() > p.magnitudeThr).f(); if (w > 0) { if (capture) { double q = qDist(x, y); uAdd(q, w, uHistogram); } fit.add(w, x, y); } if (capture && w > 0.5) { e->memberOf(this); e->nextMember(members); members = e; } } _score = fit.area(); if (score() < p.scoreThreshold || (p.fitThresold >= 0 && fit.rmsError() > p.fitThresold)) { for (Edge* e = members; e; e = e->nextMember()) e->memberOf(0); return false; } _fitError = fit.rmsError(); if (capture) { // Find first endpoint float tw = 0; double u0 = 0, u1 = 0; for (int i = 0; i < UHistSize; ++i) { tw += uHistogram[i]; if (tw >= p.lineEndWeight) { u0 = uBin(i) - p.lineEndWeight; break; } } // Find second endpoint tw = 0; for (int i = UHistSize - 1; i >= 0; --i) { tw += uHistogram[i]; if (tw >= p.lineEndWeight) { u1 = uBin(i) + p.lineEndWeight; break; } } setEndPoints(u0, u1); } // Adjust (R,T) r(fit.centerX() * fit.secondPrinciaplAxisU() + fit.centerY() * fit.secondPrinciaplAxisV()); if (ux() * fit.secondPrinciaplAxisU() + uy() * fit.secondPrinciaplAxisV() >= 0) setUnitVec(fit.secondPrinciaplAxisU(), fit.secondPrinciaplAxisV()); else { setUnitVec(-fit.secondPrinciaplAxisU(), -fit.secondPrinciaplAxisV()); r(-r()); } return true; }