首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenCV4使用viz模块显示3D图像

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

作者头像
Color Space
发布2024-01-17 18:37:45
发布2024-01-17 18:37:45
9530
举报

视觉/图像重磅干货,第一时间送达

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

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

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

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

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

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

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

代码语言:javascript
复制
// 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)加入环境变量才能得到运行结果,上面代码运行结果如下:

动画效果:

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

—THE END—

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • —THE END—
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档