代码之家  ›  专栏  ›  技术社区  ›  Marco Ferro

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

  •  1
  • Marco Ferro  · 技术社区  · 10 年前

    我在代码中同时使用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”实例后调用terminate what():ALMotion::设置角度 ALBroker::methodCall:方法:setAngles,参数:[[“HeadYaw”,“HeadPitch”],[0,0],0] ALMotion::设置角度 ALMotion::设置角度 fractionMaxSpeed:最大速度的分数应介于0.0和1.0之间

    i、 e.它说 setAngles() 不是预期的介于0.0和1.0之间的值。实际上,它将其读作0(可能被强制转换为 int ?). 当然,从代码中可以看出,这不是真的。“有趣”的是,如果我评论 cv::imshow() ,代码正常工作,不会出现错误。

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

    更新:也许我忘了说这段代码在while循环中。无论如何,使用 post NAOqi代理对象的属性,我创建了该方法 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 回复  |  直到 10 年前
        1
  •  0
  •   Marco Ferro    10 年前

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