https://blog.csdn.net/robinhjwy/article/details/78570166
创建一个窗口并显示坐标系:
//1.创建可视化窗口
viz::Viz3d vis("VO");
//2.构造一个坐标系,并显示到窗口中
vis.showWidget("Coordinate", viz::WCoordinateSystem());
//3.开启永久循环暂留
vis.spin();
1、showWidget函数创建坐标系:
void showWidget(const String &id, const Widget &widget, const Affine3d &pose = Affine3d::Identity());
第一个参数是特殊的名称,第二个参数用viz::WCoordinateSystem()直接当场创建了一个坐标系部件,最后一个Affine3d位姿参数。
2、spin()函数画面永久停留
spinOnce(1,false)函数给定时间内循环
void spinOnce(int time = 1, bool force_redraw = false);
简单实例程序变种
viz::Viz3d vis("VO");
//创建世界和相机坐标系
viz::WCoordinateSystem world_coor(1.0),camera_coor(0.5);
vis.showWidget("World",world_coor);
vis.showWidget("Camera",camera_coor);
vis.spinOnce(1,false);
第三句,永久循环暂留。
spin()函数开启一个event loop永远循环。直观的用处就是让画面停在那里,如果没有这一句的话,画面基本就是秒闪一下然后消失了。
关于spin()函数有两点要说:
第一就是spin()真的会让程序停在那里,不会运行下方的语句,除非按q或者e建,才会继续走。
第二就是这个函数的变种:void spinOnce(int time = 1, bool force_redraw = false); 表示event loop循环time时间,也就是在词句的停留时间,time的单位为毫秒,第二个force_redraw还不知道有啥用,测试来看,没有区别。后面有这个函数的示例程序。
3、makeCameraPose()构造相机在世界坐标系下位姿
Affine3d cv::viz::makeCameraPose( Vec3d & position,Vec3d & focal_point,Vec3d& y_dir )
参数:相机的世界坐标,相机中心点坐标,
4、setWidgetPose()窗口小部件位姿
void cv::viz::Viz3d::setWidgetPose(String & id, Affine3d & pose )
参数:名称,变换矩阵位姿 T
具体使用实例:
Affine3d cam_pose=viz::makeCameraPose(cam_pos,cam_focal_point,cam_y_dir);
Affine3d T (
Affine3d::Mat3(
T.rotation()(0,0),T.rotation()(0,1),T.rotation()(0,2),
T.rotation()(1,0),T.rotation()(1,1),T.rotation()(1,2),
T.rotation()(2,0),T.rotation()(2,1),T.rotation()(2,2),),
Affine3d::Vec3(
T.translation()(0,0),T.translation()(0,1),T.translation()(0,2))
)
vis.setWidgetPose("Camera",T);
"Camera"很重要:代表动的坐标系是哪个,要对应上。
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//1.创建可视化窗口
viz::Viz3d vis("VO");
//2.构造一个坐标系,并显示到窗口中
viz::WCoordinateSystem world_coor(1.0),camera_coor(0.5);
//相机在世界坐标系下位姿视角
Affine3d cam_pose=viz::makeCameraPose((0,-1,-1),(0,0,0),(0,1,0));
vis.setViewerPose(cam_pose);
vis.showWidget("World",world_coor);
vis.showWidget("Camera",camera_coor);
//先创建一旋转向量,罗德里格斯公式转为旋转矩阵,
Mat rvec = Mat::zeros(1, 3, CV_32F);
while(!vis.wasStopped())
{
rvec.at(0,0) = 0.f;
rvec.at(0,1) += CV_PI*0.01f;
rvec.at(0,2) = 0.f;
Mat rmat;
Rodrigues(rvec, rmat);
Affine3f pose(rmat, Vec3f(0,0,0));
vis.setWidgetPose("Camera", pose);
vis.spinOnce(1, true);
}
//3.开启循环暂留
vis.spinOnce(1, true);
}
总结一波:
1、先创建窗口viz::Viz3d vis("VO");
2、构造一个坐标系,并显示到窗口中
viz模块中,窗口内显示的一切东西通通为部件,也就是Widget,这里调用showWidget()函数,将部件显示在窗口中。
viz::WCoordinateSystem world_coor(1.0)//创建坐标系
vis.showWidget("World",world_coor);//显示在窗口中
void showWidget(const String &id, const Widget &widget, const Affine3d &pose = Affine3d::Identity());
3、调整某部件的位姿
Affine3f pose(rmat, Vec3f(0,0,0));//构建变换仿射矩阵4*4
vis.setWidgetPose("Camera", pose);
说白了就是利用循环来不断调整上面Camera部件的位姿,达到动画的效果,另外这里就利用到了Camera的ID,来表征调整的是Camera的位姿。