首页 > 其他分享 >OpenCV4.2使用viz模块显示3D图像

OpenCV4.2使用viz模块显示3D图像

时间:2022-10-18 12:33:37浏览次数:70  
标签:1.0 OpenCV4.2 viz translation include rot myWindow 3D


    在OpenCV 3D视觉中如果需要显示三维数据或图像就需要用到viz模块,viz是OpenCV的3D显示模块,OpenCV官方release版本不包含此模块,需要我们自己cmake编译。

    Cmake步骤这里不做详细介绍,主要介绍一下过程中可能遇到的问题:

    一、contrib模块路径OPENCV_EXTRA_MODULES_PATH一律用反斜杠‘/’

OpenCV4.2使用viz模块显示3D图像_ios

    二、viz模块依赖VTK(Visualization Toolkit),需要下载​​https://vtk.org/download/​​并cmake编译,步骤使用默认即可,相对较简单,这里使用最新的8.2.0版本,cmake后生成如下Install文件:

OpenCV4.2使用viz模块显示3D图像_ios_02

然后在cmake选项中勾选WITH_VTK(OpenCV4.2默认勾选),同时设置VTK_DIR为lib\cmake\vtk-8.2,如下图所示:

OpenCV4.2使用viz模块显示3D图像_ios_03

    三、其他步骤相对简单,先config,在generate,然后生成ALL_BUILD,生成仅用于项目的Install,得到如bin、etc、include、x64文件夹,其中可以看到OpenCV2文件夹下有了viz.hpp,然后看下其他文件如lib/dll是否生成成功,我这里统一封装为opencv_world420.dll/lib

OpenCV4.2使用viz模块显示3D图像_ios_04

    接下来就可以写个demo来测试是否编译成功了,可以自己新建一个工程,配置包含目录、库目录、附加依赖项,然后添加如下测试代码:


// Viz3D.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#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;
}

    运行时注意除了将opencv_world420.dll放到工程目录或加到环境变量,还需要将vtk的bin目录(D:\VTK_Install\bin)加入环境变量才能得到运行结果,上面代码运行结果如下:

OpenCV4.2使用viz模块显示3D图像_3d_05

    动画效果:


    当然你也可以显示三维图形类似如下效果:

OpenCV4.2使用viz模块显示3D图像_ios_06

OpenCV4.2使用viz模块显示3D图像_ios_07

标签:1.0,OpenCV4.2,viz,translation,include,rot,myWindow,3D
From: https://blog.51cto.com/stq054188/5765801

相关文章