Quantcast
Channel: beginners - openFrameworks
Viewing all articles
Browse latest Browse all 4929

Storing and using previous position of object

$
0
0

@t.espinoza wrote:

Hi all! I'm having some trouble with getting the coordinates from the previous frame of one of my shapes. What I have going on right now is a project that uses blob tracking to interact with ofxBox2d shapes/joints. I'm trying to get the previous position of the smoothedPoint variable I'm tracking in order to check when the point is moving (using the solution from this thread: https://forum.openframeworks.cc/t/storing-mouse-position/14303) and to use to check the object's velocity (which I am unsure of if I'm doing that right).

I tried this method (here: https://forum.openframeworks.cc/t/get-previous-mouse-coordinate/16802) for getting the previous position, which is having an ofPoint and setting it equal to the current position of the point I'm tracking at the end of update, but that doesn't seem to be working.

The previous movement is working with this project, so I feel like I'm not too far off: https://github.com/tespin/interactiveLine

Below is the code. The middle of it is dealing with Kinect/Box2d stuff. In the beginning of the update function I have a conditional statement to check if the mouse is moving, and at the end of it, I'm 1) checking to see if the mouse is moving, and if it is, setting it to false, and 2) setting the prev position to the current position. The formatted code is below:

void ofApp::update()
{
	ofBackground(100, 100, 100);

    if (prevPosition != smoothedPoint)
    {
        mouseMoving = true;
        std::cout << "mouseMoving" << endl;
    }

    ofPoint ballDist = ofPoint(smoothedPoint - prevPosition);

    // Kinect----------------------------------------------------------------------------
    kinect.update();

    // there is a new frame and we are connected
    if(kinect.isFrameNew()) {

        // load grayscale depth image from the kinect source
        grayImage.setFromPixels(kinect.getDepthPixels());
        // we do two thresholds - one for the far plane and one for the near plane
        // we then do a cvAnd to get the pixels which are a union of the two thresholds
        grayThreshNear = grayImage;
        grayThreshFar = grayImage;
        grayThreshNear.threshold(nearThreshold, true);
        grayThreshFar.threshold(farThreshold);
        cvAnd(grayThreshNear.getCvImage(), grayThreshFar.getCvImage(), grayImage.getCvImage(), NULL);
        // update the cv images
        grayImage.flagImageChanged();

        // find contours which are between the size of 100 pixels and 1/2 the w*h pixels.
        // also, find holes is set to true so we will get interior contours as well....
        contourFinder.findContours(grayImage, 100, (kinect.width*kinect.height)/2, 1, false);
    }


    // Find the tip of the biggest blob.  We only search for one blob.
    for (int i = 0; i < contourFinder.nBlobs; i++){
        float maxY = std::numeric_limits<float>::lowest();
        std::size_t index = 0;
        std::vector<ofPoint>& points = contourFinder.blobs[i].pts;

        // go around contour to find the highest value of Y (i.e. the lowest in our setup).
        for (int p = 0; p < points.size(); ++p)
        {
            if (points[p].y > maxY)
            {
                maxY = points[p].y;
                index = p;
            }
        }

        // Smooth the position with a simple low pass filter.
        smoothedPoint = smoothedPoint * alpha + points[index] * (1.0 - alpha);
    }
    //far: 205, near: 255
    cout << "Far Threshold: " << farThreshold << "Near Threshold: " << nearThreshold << endl;
    // Kinect----------------------------------------------------------------------------

// Box2d-----------------------------------------------------------------------------
    box2d.update();

    friendlyTimer = ofGetElapsedTimef();

    deg += 0.3;

    pointDelta = smoothedPoint.distance(prevPosition);
    pointVelocity = pointDelta / velocityTimer;

    setFriendly();

    if (mouseMoving)
    {
        mouseMoving = false;
    }

    prevPosition = ofPoint(smoothedPoint);

//    std::cout << "Previous position: " << prevPosition << " Current Position: " << smoothedPoint << endl;
    std::cout << "ball dist" << ballDist << endl;
// Box2d-----------------------------------------------------------------------------
}

In case it's necessary to look at the whole project, here is a link: https://github.com/tespin/Buddy/tree/master/Buddy/src

Thanks.

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 4929

Trending Articles