cv::imshow 似乎损坏了一些内存区域
cv::imshow seems to corrupt some memory areas
我在代码中同时使用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 分数最大速度:预计最大速度在 0.0 和 1.0 之间的一小部分
即它说setAngles()
的第三个参数不是预期的 0.0 到 1.0 之间的值。实际上,它将其读取为0(可能转换为int
?当然,正如您从代码中看到的那样,这不是真的。"有趣"的方面是,如果我评论cv::imshow()
,代码正常工作并且不会引发任何错误。
有谁知道发生这种情况的可能原因吗?显然,在机器人上设置角度的操作与通过OpenCV显示图像的操作之间没有联系。你可以帮我吗?谢谢
更新:也许我忘了说这段代码在 while 循环中。无论如何,使用 NAOqi 代理对象的 post
属性,我使该方法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);//*/
}
问题已半解决。我在 Ubuntu 14.04 上,我使用的是 Naoqi 1.14,它似乎一直支持 12.04。传递 Ubuntu 12.04 实际上可以防止此错误发生。也许我应该尝试使用 Naoqi 2.1 来检查在 Ubuntu 14.04 上运行是否可以。
- wxWidgets mac剪贴板在3.1.3上坏了?
- 计时器坏了或者其他什么的
- boost::p rocess::env 在 ubuntu 19.04 上坏了?
- std::regex 是否保证了最坏情况下的时间复杂度?
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- SFML sf::Text::setFillColor 坏了,还是我做错了什么
- DX9从全屏切换到窗口,给出了错误的客户端区域
- QT设置了QplaintExtedIt的滚动区域,以匹配Anothers的滚动区域
- 为函数设计接口时,强制用户(客户端)提供内存区域 >= 所需大小。怎么做,是好是坏?
- 利用OpenGL、c++实现了绕线数算法计算内外部区域
- vswprintf_l扩展了vswprintf的区域设置版本
- 开关内的案例不停地循环,即使我坏了
- cv::imshow 似乎损坏了一些内存区域
- GJK算法陷入了不同Voronoi区域情况的循环中
- 溪水变坏了
- 我最基本的c++程序坏了,我不知道为什么
- 给定一个矩形区域和一组矩形,检查它们是否覆盖了整个区域
- 我的电脑怎么坏了?
- 条件评估是否优化?这个代码坏了吗
- 地图:坏Ptr,即使找到了钥匙