OpenCV4 Viz模塊使用學習(二)

    第二個demo如下,目標:

  • 將小部件添加到可視化窗口
  • 使用Affine3設置小部件的姿勢
  • 沿軸旋轉和平移窗口小部件
#include <opencv2/viz.hpp>
#include <opencv2/calib3d.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	viz::Viz3d myWindow("Coordinate Frame");
	myWindow.showWidget("Coordinate Widget", viz::WCoordinateSystem());
	viz::WLine axis(Point3f(-1.0f, -1.0f, -1.0f), Point3f(1.0f, 1.0f, 1.0f));
	axis.setRenderingProperty(viz::LINE_WIDTH, 4.0);
	myWindow.showWidget("Line Widget", axis);
	viz::WCube cube_widget(Point3f(0.5, 0.5, 0.0), Point3f(0.0, 0.0, -0.5), true, viz::Color::blue());
	cube_widget.setRenderingProperty(viz::LINE_WIDTH, 4.0);
	myWindow.showWidget("Cube Widget", cube_widget);
	Mat rot_vec = Mat::zeros(1, 3, CV_32F);
	float translation_phase = 0.0, translation = 0.0;
	while (!myWindow.wasStopped())
	{
		/* Rotation using rodrigues */
		rot_vec.at<float>(0, 0) += (float)CV_PI * 0.01f;
		rot_vec.at<float>(0, 1) += (float)CV_PI * 0.01f;
		rot_vec.at<float>(0, 2) += (float)CV_PI * 0.01f;
		translation_phase += (float)CV_PI * 0.01f;
		translation = sin(translation_phase);
		Mat rot_mat;
		Rodrigues(rot_vec, rot_mat);
		Affine3f pose(rot_mat, Vec3f(translation, translation, translation));
		myWindow.setWidgetPose("Cube Widget", pose);
		myWindow.spinOnce(1, true);
	}
	return 0;
}

使用CoordinateSystemWidget在窗口中顯示座標軸。

myWindow.showWidget(“ Coordinate Widget”,viz :: WCoordinateSystem());

顯示代表軸(1,1,1)的線,在座標系畫一條線,指定起點和終點,線寬4.0

viz :: WLine軸(Point3f(-1.0f,-1.0f,-1.0f),Point3f(1.0f,1.0f,1.0f));
axis.setRenderingProperty(viz :: LINE_WIDTH,4.0);
myWindow.showWidget(“ Line Widget”,axis);
構造一個立方體,最小點,最大點,線寬,顏色。
viz :: WCube cube_widget(Point3f(0.5,0.5,0.0),Point3f(0.0,0.0,-0.5),trueviz :: Color :: blue());
cube_widget.setRenderingProperty(viz :: LINE_WIDTH,4.0);
myWindow.showWidget(“ Cube Widget”,cube_widget);

從rodrigues矢量創建旋轉矩陣

rot_vec.at<float>(0,0) += CV_PI * 0.01f;

rot_vec.at<float>(0,1) += CV_PI * 0.01f;

rot_vec.at<float>(0,2) += CV_PI * 0.01f;

...

Mat rot_mat;

Rodrigues(rot_vec, rot_mat);

使用Affine3f設置立方體的位置

Affine3f pose(rot_mat, Vec3f(translation, translation, translation));

myWindow.setWidgetPose("Cube Widget", pose);

然後就是顯示了,是一個立方體旋轉的動畫效果,這時候就要注意while循環中的myWindow.spinOnce(1, true)妙用了

https://youtu.be/22HKMN657U0?t=3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章