cv :: imshow似乎破坏了一些内存区域

时间:2016-02-18 10:36:50

标签: c++ opencv imshow nao-robot

我在代码中使用OpenCV库和C ++ NAOqi API。特别是,我需要使用方法setAngles()来设置机器人的头部关节。执行这些行:

//(1) set desired joint values on the desired joint names
pan = 0.0;
tilt = 0.0;
AL::ALValue names = AL::ALValue::array(PAN_JOINT,TILT_JOINT);
AL::ALValue angles = AL::ALValue::array(pan,tilt);
cout << "pan: " << pan << endl;
cout << "tilt: " << tilt << endl;
motionPtr->setAngles(names,angles,0.1f);

//(2) capture image from subscribed camera
AL::ALValue img = cameraPtr->getImageRemote(cameraClient);
imgHeader.data = (uchar*) img[6].GetBinary();
cameraPtr->releaseImage(cameraClient);

//(3) show image
imshow("test",imgHeader);
waitKey(30);

导致崩溃,并出现以下错误:

  

在抛出'AL :: ALError'的实例后终止调用     what():ALMotion :: setAngles           ALBroker :: methodCall:方法:setAngles,params:[[“HeadYaw”,“HeadPitch”],[0,0],0]           ALMotion :: setAngles           ALMotion :: setAngles       fractionMaxSpeed:预期最大速度的一小部分介于0.0和1.0之间

即。它说setAngles()的第三个参数不是0.0和1.0之间的值。实际上,它将其读为0(可能会转换为int?)。当然,从代码中可以看出,这不是真的。 “有趣”的方面是,如果我评论cv::imshow(),代码通常会起作用,不会产生任何错误。

有人知道可能发生这种情况的原因吗?显然,在机器人上设置角度和通过OpenCV显示图像的操作之间没有联系。你能帮助我吗? 感谢

更新:也许我忘了说这段代码在while循环中。无论如何,使用NAOqi代理对象的post属性,我使方法setAngles在后​​台运行并行线程。通过这种方式,可以正确显示图像,并且不会出现错误。但是,没有设置机器人关节,机器人仍然是。同样,如果未调用cv::imshow,则不会发生这种情况。这是包含整个while循环的完整函数。

//these are member variables of a class
double pan = 0.0;
double tilt = 0.0;
Mat imgHeader = Mat(320,240,CV8UC3);
bool headset = false;

//main loop
while(!headset){

    motionPtr->setStiffnesses("Head", 1.0f);
    int dtilt, dpan;
    int res;
    /**** Get inputs from joystick ***/
    res = joy->readEv();
    if(res != -1){
        if(jse->type & JS_EVENT_BUTTON){
            if((int)jse->number == X_BUTTON){//tilt down
                dtilt = -1;
            }
            else if((int)jse->number == TRIANGLE_BUTTON){//tilt up
                dtilt = 1;
            }
            else if((int)jse->number == START_BUTTON){//tilt down
                (firstKeyIgnored) ? (headset = true) : (firstKeyIgnored = true) ;
            }
            else{
                dtilt = 0;
            }
        }

        updateTilt(dtilt); //<-- it just changes the value of the member variable `tilt`

    }


    AL::ALValue names = AL::ALValue::array(PAN_JOINT,TILT_JOINT);
    AL::ALValue angles = AL::ALValue::array(pan,tilt);
    int id;
    id = motionPtr->post.setAngles(names,angles,0.1f);


    //capture image from subscribed camera
    ALimg = cameraPtr->getImageRemote(cameraClient);
    imgHeader.data = (uchar*) ALimg[6].getObject();
    imshow("test",imgHeader);
    waitKey(30);//*/
}

1 个答案:

答案 0 :(得分:0)

问题半解决。我在Ubuntu 14.04上使用Naoqi 1.14,这似乎有支持,直到12.04。传递Ubuntu 12.04实际上可以防止发生此错误。也许我应该尝试使用Naoqi 2.1来检查在Ubuntu 14.04上运行是否正常。