69 float centroidX, centroidY;
84 static bool computeAxes;
90 sumX= sumY= sumXX= sumYY= sumXY= 0;
102 area += moments.area;
104 sumX += moments.sumX;
105 sumY += moments.sumY;
107 sumXX += moments.sumXX;
108 sumYY += moments.sumYY;
109 sumXY += moments.sumXY;
115 bool operator==(
const SMoments &rhs)
const {
116 if (area != rhs.area)
return 0;
117 if (sumX != rhs.sumX)
return 0;
118 if (sumY != rhs.sumY)
return 0;
120 if (sumXX != rhs.sumXX)
return 0;
121 if (sumYY != rhs.sumYY)
return 0;
122 if (sumXY != rhs.sumXY)
return 0;
130 unsigned char model : 3 ;
131 unsigned short row : 9 ;
132 unsigned short startCol : 10;
133 unsigned short endCol : 10;
135 const static short invalid_row= 0x1ff;
143 void GetMoments(
SMoments &moments)
const {
147 moments.area = (e-s);
152 moments.sumX = ( (e2-s2) + (e-s) ) / 2;
153 moments.sumY = (e-s) * y;
155 if (SMoments::computeAxes) {
158 moments.sumXY= moments.sumX*y;
159 moments.sumXX= (2*(e3-s3) + 3*(e2-s2) + (e-s)) / 6;
160 moments.sumYY= moments.sumY*y;
165 void GetMomentsTest(
SMoments &moments)
const;
173 segment(segmentInit), next(NULL) {}
179 static int leakcheck;
191 short left, top, right;
193 void getBBox(
short &leftRet,
short &topRet,
194 short &rightRet,
short &bottomRet) {
198 bottomRet= lastBottom.row;
216 static bool recordSegments;
218 static bool testMoments;
223 int GetArea()
const {
224 return(moments.area);
246 void Assimilate(
CBlob &futileResister);
250 void UpdateBoundingBox(
int newLeft,
int newTop,
int newRight);
286 CBlob **previousBlobPtr;
290 CBlob *finishedBlobs;
292 static bool keepFinishedSorted;
310 int ListLength(
const CBlob *b);
316 void MergeLists(
CBlob *&old1,
CBlob *&old2,
CBlob **&newptr,
int maxelts);
323 void AssertFinishedSorted();
350 void BlobNewRow(
CBlob **ptr);
351 void RewindCurrent();
352 void AdvanceCurrent();