cv::imshow повреждает некоторые области памяти

Я использую библиотеку 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 фракция MaxSpeed: ожидаемая доля максимальной скорости от 0,0 до 1,0

то есть это говорит о том, что третий аргумент 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 ответ

Решение

Проблема полурешена. Я на Ubuntu 14.04, и я использую Naoqi 1.14, который, кажется, имеет поддержку до 12.04. Переход на Ubuntu 12.04 фактически предотвращает возникновение этой ошибки. Может быть, я должен попробовать использовать Naoqi 2.1, чтобы проверить, нормально ли работает на Ubuntu 14.04.

Другие вопросы по тегам