在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来测试是否编译成功了,可以自己新建一个工程,配置包含目录、库目录、附加依赖项,然后添加如下测试代码:
// 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)加入环境变量才能得到运行结果,上面代码运行结果如下:
动画效果:
当然你也可以显示三维图形类似如下效果:
本文分享自 OpenCV与AI深度学习 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!