В своем коде я использую как библиотеку 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);//*/
}
cameraPtr->releaseImage(cameraClient);
, так как вы выполняете только поверхностное назначение указателя пикселей. попробуйтеimgHeader = imgHeader.clone();
, прежде чем выпускать изображение с камеры - person berak   schedule 18.02.2016releaseImage
должен быть бесполезен сgetImageRemote
, как сказано здесь . Я попытался удалить его, но проблема все еще возникает. - person Marco Ferro   schedule 18.02.2016setAngles()
, потому что он видит неправильный третий аргумент. - person Marco Ferro   schedule 18.02.2016imgHeader
opencvMat
? Правильно ли вы настроили ширину, высоту, тип данных, шаг и т. д. перед назначениемimgHeader.data
? Я бы подумал о созданииMat
с помощью конструктора формы:Mat(int rows, int cols, int type, void* data, size_t step)
послеgetImageRemote
. - person Douglas Dawson   schedule 18.02.2016