一、安装环境
Windows 10 64位、VS2017
二、安装准备
GitHub下载可能会很慢或者下载失败,我已经将各文件上传至csdn:https://download.csdn.net/download/m0_37350758/11153525
三、VTK-8.2.0安装步骤
1.使用CMAKE生成可用VS2017编译的VTK的工程文件
(1)打开CMkae,点击 Browse Sourse 按钮选择下载好的VTK710源码。(本例中代码位于D:/Softwore/VTK/VTK-8.2.0)
(2)手动新建一个build文件夹用来存放生成的工程。(本例中位于D:/Softwore/VTK/VTK-8.2.0/build)
(3)在CMake中,点击 Browse Build 按钮,选择新建的build目录。(本例中位于D:/Softwore/VTK/VTK-8.2.0/build)
然后点击 Configure按钮,弹出的编译器选择窗口,本例中选择vs2017 x64位,点击Finish开始配置工程。
Configure完成之后我们需要确认下图中五项是勾选上的,没有勾选的手动勾选上。
确认之后再一次configure,然后generate,然后先使用管理员权限打开VS2017,在里面打开生成的VTK解决方案!
在解决方案资源管理器中右键点击ALL BUILD并点击生成进行编译。
这个过程可能时间比较久(记得用管理员权限打开),可以冲杯咖啡喝喝!
编译完成之后编译完成之后右键点击INSTALL,并点击Project Only,点击Project Only INSTALL。
整个过程完成之后,你已经完成了VTK820在Windows上的编译和安装(编译和INSTALL在debug和release两个模式下都要操作一遍,否则在后面编译OpenCV时可能会有错误)。
四、编译OpenCV4.1.0和OpenCV contrib源码
基本步骤类似于第三步,新启动一个CMake-gui。并建立一个build4.1.0目录。(本例位于D:\Softwore\OpenCV-4.1.0)
Browse Sourse选择D:\Softwore\OpenCV-4.1.0\opencv-4.1.0
Browse Build选择D:\Softwore\OpenCV-4.1.0\build4.1.0
点击Configure按钮,弹出的编译器选择窗口,本例中选择vs2017 x64位,点击Finish开始配置工程。
配置之后需要做两处修改:
再一次点击Configure按钮,针对修改项进行配置。
然后点击Generate按钮,生成Visual Studio可编译的工程。
然后先使用管理员权限打开VS2017,在里面打开生成的OpenCV解决方案。
之后操作类似于VTK编译步骤,右键点击ALL BUILD并点击build进行编译(同样时间可能会比较久),待编译完成之后,同样的,编译完成之后右键点击INSTALL,并点击Project Only,点击Project Only INSTALL(编译和INSTALL在debug和release两个模式下都要操作一遍),整个过程完成之后,你已经完成了OpenCV410+OpenCV contrib410+Viz820模块在Windows上的编译和安装。
五、测试
在D:\Softwore\OpenCV-4.1.0\build4.1.0\install\include\opencv2\viz文件夹下会看到:
之后在VS2017中新建OpenCV工程,并配置开发环境:
在属性表中VC++目录下的包含目录和库目录:
在属性表——链接器——输入——附加依赖项(添加D:\Softwore\OpenCV-4.1.0\build4.1.0\install\x64\vc15\lib文件夹下所有.lib文件):
VTK和OpenCV自己带的许多.dll,需要放到PATH能够找到的地方,这里可以放在C:\Windows\SysWOW64和C:\Windows\System32中
之后在vs工程中输入源码:
/**
* @file widget_pose.cpp
* @brief Setting pose of a widget
* @author Ozan Cagri Tonkal
*/
#include
#include
#include
using namespace cv;
using namespace std;
/**
* @function help
* @brief Display instructions to use this tutorial program
*/
static void help()
{
cout
<< "--------------------------------------------------------------------------" << endl
<< "This program shows how to visualize a cube rotated around (1,1,1) and shifted "
<< "using Rodrigues vector." << endl
<< "Usage:" << endl
<< "./widget_pose" << endl
<< endl;
}
/**
* @function main
*/
int main()
{
help();
/// 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);
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(0, 0) += (float)CV_PI * 0.01f;
rot_vec.at(0, 1) += (float)CV_PI * 0.01f;
rot_vec.at(0, 2) += (float)CV_PI * 0.01f;
/// Shift on (1,1,1)
translation_phase += (float)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;
}
编译调试没有错误的话会出现界面: