Scale and translate a blob

Hello. I am trying to scale individual blobs from ofxCv but I’m having a hard time moving them individually. I am detecting contours on a very simple image, a png with 7 circles. The goal is to create first an ofPolyline out of each blob, and then a ofPath out of each ofPolyline. I created a vector of ofPolylines and then I loop through all the blobs and add the vertices of each instance. So far so good. I then proceed to scale the polyline and to move it to the x and y position of the bounding box of the blob, but for some reason that I cannot understand the polylines don’t get drawn where they should. Here is my function:

void Layer::buildContour(){

    for (int i = 0; i < contourFinder.nBlobs; i ++){
        if (contourFinder.blobs[i].hole){
            ofPolyline blobPoly;
            ofPath  blobPath;
            ofPoint center;
            ofRectangle boundingBox;
            boundingBox = contourFinder.blobs[i].boundingRect;

            blobPoly.translate(ofPoint(boundingBox.x, boundingBox.y));

            for (int i = 0; i < blobPoly.size(); i++){


Here is how it looks.

Any ideas what I’m doing wrong? Thanks!

Hi Antonio,

I guess you want something like that, am I right ?


ofPolyline::scale() simply multiply the coordinates of the polyline vertices. Look at this gif to see what happens when we multiply the vertices coordinates by a variable amount:


The result is that the polyline is scaled “around” the upper left corner (x=0, y=0)

But you want to do this:


A solution is a 3 steps process:
1- translate the polyline to make it centered around the point (x=0, y=0)
2- scale the polyline
3- translate it back to its original position


You can try:

blobPoly.translate( - center ); // step 1
blobPoly.scale( 0.5, 0.5 ); // step 2
blobPoly.translate( center ); // step 3

Thank you very much for your explanation lilive, it worked and it’s clear now. My problem was that I was thinking that translate was going to move the Polyline in absolute terms, not in relation to the current position, so whenever I tried to move to the point (0, 0) nothing happened and it was confusing.