OpenCV Viz 3D虚拟空间模块

本文介绍了如何使用OpenCV中的Viz模块创建三维窗口并显示基本的三维图形元素,如坐标轴、线条和立方体,并通过示例代码演示了如何在三维空间中旋转和移动这些图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在OpenCV2.4.9发布release版本时添加了3D模块,实现起来非常简洁漂亮,三维虚拟空间模块是集成自三维计算机图形学、图像处理和可视化的VTK得到的,OpenCV3.0的OpenCV tutorial中例程效果如下:


首次配置Viz运行得到的效果:

源代码如下:

#include <opencv2/viz/vizcore.hpp>
#include <iostream>

using namespace cv;
using namespace std;

/**
* @function main
*/
int main()
{
    /// Create a window
    viz::Viz3d myWindow("Viz Demo");

    /// Start event loop
    myWindow.spin();

    /// Event loop is over when pressed q, Q, e, E
    cout << "First event loop is over" << endl;

    /// Access window via its name
    viz::Viz3d sameWindow = viz::getWindowByName("Viz Demo");

    /// Start event loop
    sameWindow.spin();

    /// Event loop is over when pressed q, Q, e, E
    cout << "Second event loop is over" << endl;

    /// Event loop is over when pressed q, Q, e, E
    /// Start event loop once for 1 millisecond
    sameWindow.spinOnce(1, true);
    while(!sameWindow.wasStopped())
    {
        /// Interact with window

        /// Event loop for 1 millisecond
        sameWindow.spinOnce(1, true);
    }

    /// Once more event loop is stopped
    cout << "Last event loop is over" << endl;
    return 0;
}


Windows 7下并非第一幅图像一般一片黑。其他类似例程如下:

源代码如下:

#include <opencv2/viz.hpp>
#include <opencv2/calib3d.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
	/// Create a window
	viz::Viz3d myWindow("Coordinate Frame");
	/// Add coordinate axes
	myWindow.showWidget("Coordinate Widget", viz::WCoordinateSystem());
	/// Add line to represent (1,1,1) axis
	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);
	/// Construct a cube widget
	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);
	/// Display widget (update if already displayed)
	myWindow.showWidget("Cube Widget", cube_widget);
	/// Rodrigues vector
	Mat rot_vec = Mat::zeros(1, 3, CV_32F);
	float translation_phase = 0.0, translation = 0.0;
	while (!myWindow.wasStopped())
	{
		//* Rotation using rodrigues 
		/// Rotate around (1,1,1)
		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;
		/// Shift on (1,1,1)
		translation_phase += CV_PI * 0.01f;
		translation = sin(translation_phase);
		Mat rot_mat;
		Rodrigues(rot_vec, rot_mat);
		/// Construct pose
		Affine3f pose(rot_mat, Vec3f(translation, translation, translation));
		myWindow.setWidgetPose("Cube Widget", pose);
		myWindow.spinOnce(1, true);
	}
	return 0;
}





You need to build VTK 6.1 (download) using CMake 2.8.x with shared libs turned off. VTK needs to be build as static library so it can be used to link to opencv with the VIZ module.

Build opencv with the viz module turned on using the src and build folders for vtk.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值