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: method: 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. В любом случае, используя атрибут 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);//*/
}

person Marco Ferro    schedule 18.02.2016    source источник
comment
Я думаю, ваш imgHeader Mat недействителен после cameraPtr->releaseImage(cameraClient);, так как вы выполняете только поверхностное назначение указателя пикселей. попробуйте imgHeader = imgHeader.clone();, прежде чем выпускать изображение с камеры   -  person berak    schedule 18.02.2016
comment
На самом деле, releaseImage должен быть бесполезен с getImageRemote, как сказано здесь . Я попытался удалить его, но проблема все еще возникает.   -  person Marco Ferro    schedule 18.02.2016
comment
И даже так, похоже, это не главное. Сбой в методе setAngles(), потому что он видит неправильный третий аргумент.   -  person Marco Ferro    schedule 18.02.2016
comment
Является ли imgHeader opencv Mat? Правильно ли вы настроили ширину, высоту, тип данных, шаг и т. д. перед назначением imgHeader.data? Я бы подумал о создании Mat с помощью конструктора формы: Mat(int rows, int cols, int type, void* data, size_t step) после getImageRemote.   -  person Douglas Dawson    schedule 18.02.2016
comment
Проблема полурешена. Я использую Ubuntu 14.04 и Naoqi 1.14, который, похоже, поддерживается до 12.04. Переход на Ubuntu 12.04 фактически предотвращает возникновение этой ошибки. Спасибо всем   -  person Marco Ferro    schedule 29.02.2016


Ответы (1)


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

person Marco Ferro    schedule 29.02.2016