TUIO游标+ openframeworks

时间:2014-03-21 18:55:03

标签: c++ computer-vision blob openframeworks osc

我正在尝试创建一个执行某些blob跟踪的应用,并使用TUIO cursor消息发送Unity3D的所有数据,就像CCV一样。 这就是我对消息的看法("media"是一个在发送所有blob的位置/ id或发送平均值之间切换的按钮):

  void testApp::blobOn( int x, int y, int id, int order )
    {
        cout << "blobOn() - id:" << id << " order:" << order << endl;

    ofxOscMessage m;
    m.setAddress("/tuio2/2Dcur");
    m.addStringArg("set");

    if(media == false){
        m.addIntArg(id);
        m.addFloatArg(newX);
        m.addFloatArg(newY);
        cout << "Posicao x: " << newX << endl;
        cout << "Posicao y: " << newY << endl;
    }
    else{
        m.addIntArg(0);
        m.addFloatArg(newMediaX);
        m.addFloatArg(newMediaY);
    }

    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);

    ofxOscMessage l;
    l.setAddress("/tuio/2Dcur");
    l.addStringArg("alive");

    if (blobList.size() > 0)
    {
        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                l.addIntArg(it -> first);
                cout << "it first: " << it -> first << endl;
            }
    }else{
        l.addIntArg(0);
        }
    }

    sender.sendMessage(l);
    sender.sendMessage(m);
}


 //--------------------------------------------------------------



void testApp::blobMoved( int x, int y, int id, int order)
{
    cout << "blobMoved() - id:" << id << " order:" << order << endl;

    ofCvTrackedBlob blob_ = blobTracker.getById( id );        

    ofxOscMessage m;
    m.setAddress("/tuio/2Dcur");
    m.addStringArg("set");
    if(media == false){
        m.addIntArg(id);
        m.addFloatArg(newX);
        m.addFloatArg(newY);
        cout << "Posicao x: " << newX << endl;
        cout << "Posicao y: " << newY << endl;
    }
    else{
        m.addIntArg(0);
        m.addFloatArg(newMediaX);
        m.addFloatArg(newMediaY);
    }


    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);

    ofxOscMessage n;
    n.setAddress("/tuio/2Dcur");
    n.addStringArg("alive");

    if (blobList.size() > 0)
    {

        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                n.addIntArg(it -> first);
            }
        }
        else {
            n.addIntArg(0);
        }
    }

    sender.sendMessage(n);
    sender.sendMessage(m);
}


//--------------------------------------------------------------


void testApp::blobOff( int x, int y, int id, int order )
{
    cout << "blobOff() - id:" << id << " order:" << order << endl;

    ofxOscMessage m;
    m.setAddress("/tuio/2Dcur");
    m.addStringArg("alive");

    blobList.erase(id);


    if (blobList.size() > 0)
    {
        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                m.addIntArg(it -> first);
            }
        }
        else {
            m.addIntArg(0);
        }
    }

    sender.sendMessage(m);
}

我的Unity应用程序没有收到我的消息/ blob,所以我认为它们格式错误。有人能告诉我可能出现的问题吗?

1 个答案:

答案 0 :(得分:0)

首先要提到的是

  

m.setAddress("/tuio2/2Dcur");

应该是

m.setAddress("/tuio/2Dcur");

TUIO标准(1.1和1.0)定义2Dcur如下:

/tuio/2Dcur set s x y X Y m

在你的代码中你设置s,x和y,然后你添加四次0.0(addFloatArg(0)),这样你实际上得到这样的消息:

/tuio/2Dcur set s x y 0.0 0.0 0.0 0.0

这是一个浮动太多了。在OSC中,您通常会订阅带有完整签名的邮件。这就是您在Unity应用程序中没有收到任何消息的原因。