赞
踩
Opencv中3D显示模块viz安装
最近工作需要在VS2105中调用opencv的3D显示模块viz,默认情况下,opencv点安装是不会自动安装viz模块的
关于viz模块,首先要取决于opencv的版本;在opencv4.0之前的版本,对应的opencv_contrib中是没有viz模块的,则需要从vtk包中获取,即先编译vtk,再编译opencv;而opencv4.0起,viz模块被移植进opencv_contrib中了,所以只需要加上opencv_contrib编译opencv即可
既然需要手动编译,那么cmake神器必不可少,个人整体环境如下:
Win10,x64
VS2015
cmake1.13,opencv3.4.4,vtk8.2,opencv4.0,opencv_contrib4.0(戳这里下载, 提取码:funk )
本文使用的cmake是事先编译好的exe,所以不需要安装了,有需要从上文连接下载即可;若自己安装也非常简单,同一般安装程序一样,下一步即可
解压cmake包,打开bin目录下的cmake-gui.exe
1)解压VTK-8.2.0.zip
2)cmake配置
3)Generate(选择vs2015编译器)
4)选项配置
A:选中BUILD_SHARED_LIBS(默认)
B:取消BUILD_EXAMPLES(默认),如果深入研究VTK的同学,可以勾选上,学学例子
C:取消BUILD_TESTING(默认)
D:install路径,默认C:/Program Files/VTK,默认安装在C盘系统目录下,当然我们也可以自己设置路径:(我的在安装包下VTK,这个可以自己随意)
D:/program files/Opencv_vtk/VTK-8.2.0/VTK
E:再次generate(全部默认选项,不需要)
5)Configure,完全后就可关闭cmake了
6)打开build/VTK.sln
若Install路径为C盘系统,则需要用管理员权限打开,不然后面install时会因为权限不够报错;若存在右键没有管理员打开选项,则用管理员权限打开cmd,进入build目录,运行VTK.sln
若为自己设置的路径,则不需要管理员权限,打开即可
7)选择Debug或Release,默认为Debug,根据自己需求,也可两个分开都编译出来
8)ALL_BUILD(点击ALL_BUILD–>>生成,时间有点长)
9)INSTALL(点击INSTALL–>>仅用于项目–>>仅生成INSTALL)
install后,VTK目录(自己设置的install目录,或默认C:/Program Files/VTK)就有了vtk相关头文件,库文件
10)Debug编译出来后,备份库文件,编译Release版本;然后整理打包,头文件相同,但库文件不同,需要分开
Opencv的编译网上一大堆,本人前期博客也总结过,这里就不详述;只是再配置选项时,注意选上WITH_VTK
VTK_DIR:若安装在C盘,cmake会自动找到;如自己设置路径需要手动指定到自己install VTK的位置(D:/program files/Opencv_vtk/VTK-8.2.0/VTK/Release/lib/cmake/vtk-8.2)
然后打开OpenCV.sln,编译ALL_BUILD,INSTALL
最后在build/install下就会看到我们想要的文件(检查include下是否有viz就可以了)
这个就更简单了,只需在配置选项时,指定contrib包的路径即可(OPENCV_EXTRA_MOUDULES_PATH)
同上
1)配置
这个网上也很多了,说白了就是告诉工程,需要加载的库:头文件在哪?,lib文件需要哪些?,dll文件在哪?
2)显示3D手
下列代码只是测试用,并不最优;需要注意的是多次调用showWidget(“id”, Line1)时,需要用不同的id,否则会覆盖;当然viz里面还有很多方法,这里就不一一举例
void Show3DPoint(std::vector<std::pair<std::string, std::vector<cv::Point3f>>> handFrame3DPoint , float scale, float lineW, float circleR) { //初始化 cv::viz::Viz3d window("window"); //显示坐标系 window.showWidget("Coordinate", cv::viz::WCoordinateSystem()); for (int n = 0; n < handFrame3DPoint.size(); n++) { std::vector<cv::Point3f> line1, line2, line3, line4, line5; cv::String hand(cv::format("%d", n)); for (int p = 0; p < handFrame3DPoint[n].second.size(); p++) { cv::String pt(cv::format("%d", p)); cv::Point3f point; point.x = scale*handFrame3DPoint[n].second[p].x; point.y = scale*handFrame3DPoint[n].second[p].y; point.z = scale*handFrame3DPoint[n].second[p].z; cv::Vec3d normal(0,0,1); cv::viz::WCircle circle(scale*circleR, point, normal); window.showWidget(hand + pt, circle); if (p==0) { line1.push_back(point); line2.push_back(point); line3.push_back(point); line4.push_back(point); line5.push_back(point); } else if (p < 5) line1.push_back(point); else if (p < 9) line2.push_back(point); else if (p < 13) line3.push_back(point); else if (p < 17) line4.push_back(point); else line5.push_back(point); } cv::viz::WPolyLine Line1(line1,cv::viz::Color::red()); Line1.setRenderingProperty(cv::viz::LINE_WIDTH, scale*lineW); window.showWidget(hand + "line1", Line1); cv::viz::WPolyLine Line2(line2, cv::viz::Color::yellow()); Line2.setRenderingProperty(cv::viz::LINE_WIDTH, scale*lineW); window.showWidget(hand + "line2", Line2); cv::viz::WPolyLine Line3(line3, cv::viz::Color::blue()); Line3.setRenderingProperty(cv::viz::LINE_WIDTH, scale*lineW); window.showWidget(hand + "line3", Line3); cv::viz::WPolyLine Line4(line4, cv::viz::Color::orange()); Line4.setRenderingProperty(cv::viz::LINE_WIDTH, scale*lineW); window.showWidget(hand + "line4", Line4); cv::viz::WPolyLine Line5(line5, cv::viz::Color::green()); Line5.setRenderingProperty(cv::viz::LINE_WIDTH, scale*lineW); window.showWidget(hand + "line5", Line5); } while (!window.wasStopped()) { window.spinOnce(1, true); } }
3)显示结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。