Beispiel #1
0
/* Checks if any of our blobs are overlapping.  If so, then merge then and
   eliminate one of them.
 */
void Blobs::checkForMergers()
{
    for (int i = 1; i < numBlobs; i++) {
        for (int j = 0; j < i; j++) {
            if (blobsOverlap(j, i)) {
                mergeBlobs(i, j);
            }
        }
    }
}
void segmentImageTrack::track(float _levity)
{
  levity = _levity;
  if(iter == true)
  {
    // apply hard constraints to blob
    applyHardConst();
  }
  else
  {
    iter = true;
  }
  // merge all remaining blobs into a super blob
  mergeBlobs();
}
Beispiel #3
0
// vector<BlobCollection> horizontalBlob
void BlobDetector::formBlobs(Color blobColor) {
	VisionPoint ***hp = classifier_->horizontalPoint;

	//cout << "Forming blobs..." << endl;
	int hbpos = blobColor;

	if(blobColor == c_BLUE)
		hbpos = c_FIELD_GREEN;

	if(blobColor == c_YELLOW)
		hbpos = c_ORANGE;

	horizontalBlob[hbpos].clear();
	int numBlobs = 0;
	int numBlobs2 = 0;
	for (int y = 0; y < iparams_.height; y+=2) {
		int numRuns = classifier_->horizontalPointCount[blobColor][y];

		for (int i = 0; i < numRuns; ++i) {
			vector<VisionPoint*> children = hp[blobColor][y][i].children;

			if (children.size() > 2) {
				++numBlobs;
				// get bounding box
				uint16_t xi, xf, dx, yi, yf, dy, sumY, sumX = 0;

				xi = iparams_.width;
				xf = 0;
				yi = iparams_.height;
				yf = 0;
				sumY = sumX = 0;
				int numCorrectColorPixels = 0;
				for(size_t c = 0; c < children.size(); ++c) {
					if (children[c]->xi < xi)
						xi = children[c]->xi;
					if (children[c]->yi < yi)
						yi = children[c]->yi;
					if (children[c]->xf > xf)
						xf = children[c]->xf;
					if (children[c]->yf > yf)
						yf = children[c]->yf;
					sumY += yi;
					sumX += xi + dx/2;
				}
				dx = xf - xi + 1;
				dy = yf - yi + 1;

				for(int a = xi; a <= xf; ++a) 
				{
					for(int b=yi; b<=yf; ++b) 
					{
						if(getSegPixelValueAt(a, b) == blobColor)
							numCorrectColorPixels++;
					}
				}
				float area = abs(dx) * 1.0 * abs(dy);
				float ratio = numCorrectColorPixels / area;
				if (ratio > 0.65  && area > 225) {
					numBlobs2++;
					Blob b;
					b.xi = xi;
					b.xf = xf;
					b.yi = yi;
					b.yf = yf;
					b.dx = dx;
					b.dy = dy;
					b.correctPixelRatio = ratio;
					b.numCorrectColorPixels = numCorrectColorPixels;
					b.avgX = xi + dx / 2;
					b.avgY = yi + dy / 2;
					assert(b.xi + b.dx - 1< iparams_.width);
					assert(b.xf < iparams_.width);
					assert(b.yi + b.dy - 1 < iparams_.height);
					assert(b.yf < iparams_.height);
					assert(b.dx < iparams_.width);
					assert(b.dy < iparams_.height);
					assert(b.dx > 0);
					assert(b.dy > 0);
					assert(b.correctPixelRatio > 0);
					assert(b.numCorrectColorPixels > 0);

					horizontalBlob[hbpos].push_back(b);
				}
			}
		}
		BlobCollection mergedBlobs = mergeBlobs(horizontalBlob[hbpos], XTHRESHOLD, YTHRESHOLD);
		horizontalBlob[hbpos].clear();
		for(size_t i = 0; i < mergedBlobs.size(); ++i)
		{
			horizontalBlob[hbpos].push_back(mergedBlobs[i]);
		}
		//cout << "Blobs color " << blobColor << " : " << numBlobs << " numBlobs2 " << numBlobs2 << " real size " << horizontalBlob[blobColor].size() << endl;
	}
	//cout << "End forming blobs..." << endl;
}
Beispiel #4
0
void testMergeBlobs2()
{
    printf("\nTEST MERGE BLOBS - 2\n");

    int blobCount = 3;
    CvPoint p1, p2, p3, p4;

    /////////////////////////////////////////////
    // Test 2

    Blob* b2 = malloc(blobCount * sizeof(Blob));
    CvSeq* blobPoints2[blobCount];
    CvMemStorage* storage2 = cvCreateMemStorage(0);
    initPointSeqs(blobPoints2, blobCount, storage2);

    b2[0].box.x = 1; b2[0].box.y = 1;
    b2[0].box.width = 2; b2[0].box.height = 2;
    p1 = cvPoint(1,1);
    p2 = cvPoint(1,3);
    p3 = cvPoint(3,3);
    p4 = cvPoint(3,1);
    cvSeqPush(blobPoints2[0], &p1);
    cvSeqPush(blobPoints2[0], &p2);
    cvSeqPush(blobPoints2[0], &p3);
    cvSeqPush(blobPoints2[0], &p4);
    b2[0].points = blobPoints2[0];

    b2[1].box.x = 2; b2[1].box.y = 2;
    b2[1].box.width = 2; b2[1].box.height = 2;
    p1 = cvPoint(2,2);
    p2 = cvPoint(2,4);
    p3 = cvPoint(4,4);
    p4 = cvPoint(4,2);
    cvSeqPush(blobPoints2[1], &p1);
    cvSeqPush(blobPoints2[1], &p2);
    cvSeqPush(blobPoints2[1], &p3);
    cvSeqPush(blobPoints2[1], &p4);
    b2[1].points = blobPoints2[1];

    b2[2].box.x = 3; b2[2].box.y = 3;
    b2[2].box.width = 2; b2[2].box.height = 2;
    p1 = cvPoint(3,3);
    p2 = cvPoint(3,5);
    p3 = cvPoint(5,5);
    p4 = cvPoint(5,3);
    cvSeqPush(blobPoints2[2], &p1);
    cvSeqPush(blobPoints2[2], &p2);
    cvSeqPush(blobPoints2[2], &p3);
    cvSeqPush(blobPoints2[2], &p4);
    b2[2].points = blobPoints2[2];

    blobCount = mergeBlobs(&b2, 3, 0);
    printf("Expected: 1, Actual: %d\n", blobCount);
    printf("Expected: 12, Actual: %d\n", b2[0].points->total);

    // Boites englobantes
    printf("Expected: 1, Actual: %d\n", b2[0].box.x);
    printf("Expected: 1, Actual: %d\n", b2[0].box.y);
    printf("Expected: 4, Actual: %d\n", b2[0].box.width);
    printf("Expected: 4, Actual: %d\n", b2[0].box.height);

    free(b2);
    cvReleaseMemStorage(&storage2);
}
Beispiel #5
0
void testMergeBlobs()
{
    printf("\nTEST MERGE BLOBS\n");

    int blobCount = 3;
    CvPoint p1, p2, p3, p4;

    Blob* b = malloc(blobCount * sizeof(Blob));
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* blobPoints[blobCount];
    initPointSeqs(blobPoints, blobCount, storage);

    b[0].box.x = 0; b[0].box.y = 5;
    b[0].box.width = 2; b[0].box.height = 2;
    p1 = cvPoint(0,5);
    p2 = cvPoint(0,7);
    p3 = cvPoint(2,7);
    p4 = cvPoint(2,5);
    cvSeqPush(blobPoints[0], &p1);
    cvSeqPush(blobPoints[0], &p2);
    cvSeqPush(blobPoints[0], &p3);
    cvSeqPush(blobPoints[0], &p4);
    b[0].points = blobPoints[0];

    b[1].box.x = 1; b[1].box.y = 1;
    b[1].box.width = 3; b[1].box.height = 3;
    p1 = cvPoint(1,1);
    p2 = cvPoint(1,4);
    p3 = cvPoint(4,4);
    p4 = cvPoint(4,1);
    cvSeqPush(blobPoints[1], &p1);
    cvSeqPush(blobPoints[1], &p2);
    cvSeqPush(blobPoints[1], &p3);
    cvSeqPush(blobPoints[1], &p4);
    b[1].points = blobPoints[1];

    b[2].box.x = 3; b[2].box.y = 2;
    b[2].box.width = 3; b[2].box.height = 3;
    p1 = cvPoint(3,2);
    p2 = cvPoint(3,5);
    p3 = cvPoint(6,5);
    p4 = cvPoint(6,2);
    cvSeqPush(blobPoints[2], &p1);
    cvSeqPush(blobPoints[2], &p2);
    cvSeqPush(blobPoints[2], &p3);
    cvSeqPush(blobPoints[2], &p4);
    b[2].points = blobPoints[2];

    blobCount = mergeBlobs(&b, 3, 0);
    printf("Expected: 2, Actual: %d\n", blobCount);
    printf("Expected: 4, Actual: %d\n", b[0].points->total);
    printf("Expected: 8, Actual: %d\n", b[1].points->total);

    // Boites englobantes
    printf("Expected: 0, Actual: %d\n", b[0].box.x);
    printf("Expected: 5, Actual: %d\n", b[0].box.y);
    printf("Expected: 1, Actual: %d\n", b[1].box.x);
    printf("Expected: 1, Actual: %d\n", b[1].box.y);
    printf("Expected: 5, Actual: %d\n", b[1].box.width);
    printf("Expected: 4, Actual: %d\n", b[1].box.height);

    free(b);
    cvReleaseMemStorage(&storage);
}