2016-02-18 1 views
1

Я использую в своем коде как библиотеку OpenCV, так и API C++ NAOqi. В частности, мне нужно использовать метод setAngles() для установки головных суставов робота. Выполнение этих строк:cv :: imshow, кажется, повреждает некоторые области памяти

//(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); 

результаты в аварии со следующей ошибкой:

terminate called after throwing an instance of 'AL::ALError' what(): ALMotion::setAngles ALBroker::methodCall: method: setAngles, params: [["HeadYaw", "HeadPitch"], [0, 0], 0] ALMotion::setAngles ALMotion::setAngles fractionMaxSpeed: Expected a fraction of max speed between 0.0 and 1.0

т.е. это говорит о том, что третий аргумент setAngles() не является значением в диапазоне от 0,0 до 1,0, как и ожидалось. На самом деле, он читает его как 0 (возможно, забрасывается до int?). Конечно, это не так, как вы можете видеть из кода. «Смешной» аспект заключается в том, что, если я комментирую cv::imshow(), код обычно работает и ошибок не возникает.

Кто-нибудь знает, почему это может произойти? По-видимому, нет никаких связей между операциями установки углов на роботе и отображением изображения через OpenCV. Вы можете мне помочь? Thanks

UPDATE: Возможно, я забыл сказать, что этот код находится внутри цикла 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);//*/ 
} 
+0

Я предполагаю, что ваш imgHeader Mat недействителен после 'cameraPtr-> releaseImage (cameraClient);', поскольку вы делаете только мелкое назначение указателя пикселей. попробуйте 'imgHeader = imgHeader.clone();' перед выпуском изображения камеры – berak

+0

На самом деле, 'releaseImage' должен быть бесполезным с' getImageRemote', как сказано [здесь] (http://doc.aldebaran.com/1-14 /naoqi/vision/alvideodevice-api.html#ALVideoDeviceProxy::releaseImage__ssCR). Я попытался удалить его, но проблема все еще возникает. –

+0

И даже так, это не похоже на то, чтобы быть точкой. Аварийная ошибка на методе 'setAngles()', потому что он видит неправильный третий аргумент. –

ответ

0

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

Смежные вопросы