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’
что (): ALMotion :: setAngles
ALBroker :: methodCall: method: 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]