Opencv中3D显示模块viz安装

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

   本文使用的cmake是事先编译好的exe,所以不需要安装了,有需要从上文连接下载即可;若自己安装也非常简单,同一般安装程序一样,下一步即可
   解压cmake包,打开bin目录下的cmake-gui.exe


在这里插入图片描述

编译viz

   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

3.4.4

   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就可以了)

4.0.0

   这个就更简单了,只需在配置选项时,指定contrib包的路径即可(OPENCV_EXTRA_MOUDULES_PATH)
   同上

VS2015测试

   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)显示结果


在这里插入图片描述

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值