前言
最近项目中需要使用到OpenGL对3D模型进行渲染,然后得到图片、以及3D坐标对应在2维图片上的坐标。
这个任务需要使用到三方库 OpenGL、OpenCV。
OpenGL渲染模型 || 1. OpenCV、OpenGL的环境配置
OpenGL渲染模型 || 2. 3D模型的读取与保存
OpenGL渲染模型 || 3. opengl 将模型成渲染图片
1 opengl 概述
opengl 之下有很多的库,大概的定义如下图所示
当前比较流行的搭配是 freeglut + glew,或者 glfw + glew。如果想做简单的测试,gl、glu 即可。
glut是基本的窗口界面,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,这就保证了我们编出的程序是跨平台的,如果用MFC或者Win32只能在windows操作系统上使用。选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们可以尽量的使用glut库。
GLUT不是 OpenGL 所必须的,但它会给我们的学习带来一定的方便。
首先,需要包含头文件#include <gl/glut.h>,这是 GLUT的头文件。本来 OpenGL 程序一般还要包含<gl/gl.h>和<gl/glu.h>,但GLUT 的头文件中已经自动将这两个文件包含了,不必再次包含。
2 win10-vs2015-配置openGL 的 freeglut、glew
2.1 下载
cmake:用于编译源码的软件。免安装。
https://cmake.org/download/。
freeglut:取代 glut(glut逐渐已经不被使用)
https://sourceforge.net/projects/freeglut/
glew:
http://glew.sourceforge.net/
2.2 使用 cmake 编译 freeglut 并配置
- 将下载的包解压,到 cmake 路径下,双击 cmake-gui.exe
- 填写 freegult 解压的路径,以及编译好存放的路径(路径不存在的话,会选择同意创建路径)。
- 填写好之后,点击左下角的 【configure】
确认配置如下
- 然后再次点击 【Configure】,之后点击旁边的 【Generate】,完成之后在点击 【Open Project】
5. 我这里需要编译 release版本,所以选择了 【release + x64】。 然后在资源管理器中,选择右击 【ALL_BUILD】–>【生成】。
- 结束后,我们需要的库已经编译好了。
- 将解压后的文件夹中的 include拷贝出来
- 将 freeglut-3.2.1-solution\bin\Release\freegult.dll 拷贝出来
- 将 freeglut-3.2.1-solution\lib\Release\freegult.lib、freeglut_static.lib 拷贝出来。
这就是我们所需要的文件。
- 将文件进行配置
有两种方式。自己更习惯使用第一种,这样在工程封装打包时候,会更方便。
- 配置到自己创建的工程下。
在vs工程的属性里面进行配置:配置头文件路径、配置lib路径和名字、配置dll路径或移动dll到工程路径下(细节在后面,与opencv的配置一起记录)- 配置到系统环境下。
–> 将 include\GL 放到 【C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\GL】下(include中没有GL,自己创建一个)
–> 将 freeglut.lib 放置【C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib】
–> 将 freegult.dll 放置 【C:\Windows\SysWOW64】
- 在新建的项目的属性中,【C/C++】–【预处理器】中添加如下内容:
前两项是避免freeglut的使用报错的;最后一项,是避免使用 scranf 时候报错的_UNICODE NDEBUG _CRT_SECURE_NO_DEPRECATE
2.3 配置 GLEW
glew的包解压后的文件为:
- 【glew-2.1.0\build\vc12】路径下,用vs2015 打开 glew.sln 解决方案
- 我这里需要编译 release版本,所以选择了 【release + x64】。 然后在资源管理器中,选择右击 【解决方案glew】–>【生成解决方案】。
然后库就编译好了。
- 将文件进行配置
与freegult一样,有两种方式。
- 配置到自己创建的工程下。在vs工程的属性里面进行配置:配置头文件路径、配置lib路径和名字、配置dll路径或移动dll到工程路径下
- 配置到系统环境下。
.h: --> 将 include\GL 放到 【C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\GL】下(include中没有GL,自己创建一个)
.lib:–> 将 【glew-2.1.0\lib\Release\x64\glew32.lib、glew32s.lib】 放置【C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64】
.dll:–> 将 【\glew-2.1.0\bin\Release\x64\glew32.dll】 放置 【C:\Windows\SysWOW64】【C:\Windows\System32】
3 win10-vs2015-配置opencv
3.1 opencv 的下载
opencv的包,在官网 https://opencv.org/releases/ 进行下载。
- 方式1:官网提供了源码 Source链接,可以下载下来进行 cmake 编译。变异后会生成 opencv 的多个相关的库,编译方式与前面介绍的 freegult 的编译相似。
- 方式2:下载已经编译好的 Windows 链接。下载下来是一个 exe 文件,运行后会得到opencv的头文件、lib、dll。(自己习惯使用)
双击 下载的 opencv-3.4.12-vc14_vc15.exe,生成一个文件夹,内容如下:
我们所需要的文件:
- 将 opencv\build 的 include拷贝出来
- 将 opencv\build\x64\vc14\bin\opencv_world3412.dll 拷贝出来
- 将 opencv\build\x64\vc14\lib\opencv_world3412.lib拷贝出来
3.2 opencv 的配置
三方库的配置,我习惯是能配置在vs工程下,就不配置在系统环境下。一是受深度学习的虚拟环境的影响,避免不同库之间不兼容的影响(或许没有不兼容的问题);二是工程拷贝到其他电脑,或者工程封装打包等的方便性的问题。
打开vs2015,【新建】–>【项目】–>【Visual C++】–>【空项目】–>【选择路径,修改名称】–>【确定】
在工程路径下,创建两个文件夹:include、lib。
将上面 freeglut 和 opencv 的所用文件拷贝到工程路径下的头文件,lib文件分别拷入其中。
将 dll 文件拷贝到项目路径下。
在资源管理器中的头文件中添加一个 .h 文件,在源文件中添加一个 .cpp 文件(工程中添加了头文件,项目属性才有 C/C++这一栏)
先选择 【release + x64】。
右击项目–>【属性】–>【C/C++】–>【附加包含目录】
$(SolutionDir)include;$(SolutionDir)include\opencv;$(SolutionDir)include\opencv2
【链接器】–>【常规】–>【附加库目录】
$(SolutionDir)\lib;
【链接器】–>【输入】–>【附加依赖项】
freeglut_static.lib;freeglut.lib;opencv_world3412.lib;opencv_world3412d.lib;
【C/C++】–>【预处理器】–>【预处理器定义】
_UNICODE;NDEBUG;_CRT_SECURE_NO_DEPRECATE;
4 测试
添加cpp脚本
#include<GL/glut.h> #include<GL/freeglut.h> #include<opencv2/opencv.hpp> #include<iostream> using namespace std; void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glFlush(); } int main(int argc, char *argv[]) { //测试opencv的库==================== cv::Mat img = cv::imread("image.jpg"); cv::namedWindow("图片", CV_WINDOW_NORMAL); cv::imshow("图片", img); cv::waitKey(); //测试opengl的库===================== glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGLTest"); glutDisplayFunc(myDisplay); glutMainLoop(); return 0; }
运行结果为:
将图片关掉后:
这说明 opencv、opengl已经配置成功。接下来就要完成具体的代码实现。