opencv_contrib
opencv_contrib copied to clipboard
RGBD failing to compile with OpenGL enabled
System information (version)
- OpenCV => Latest master
- Operating System / Platform => Windows 10 x64
- Compiler => Visual Studio 2017 x64
Detailed description
With OpenGL enabled and RGBD, it does not compile due to an error:
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(234): error C2131: expression did not evaluate to a constant
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(234): note: failure was caused by a read of a variable outside its lifetime
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(234): note: see usage of 'this'
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(206): note: while compiling class template member function 'void cv::dynafu::DynaFuImpl<cv::Mat>::drawScene(cv::OutputArray,cv::OutputArray)'
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(526): note: see reference to function template instantiation 'void cv::dynafu::DynaFuImpl<cv::Mat>::drawScene(cv::OutputArray,cv::OutputArray)' being compiled
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(275): note: while compiling class template member function 'cv::dynafu::DynaFuImpl<cv::Mat>::~DynaFuImpl(void)'
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(291): note: see reference to class template instantiation 'cv::dynafu::DynaFuImpl<cv::Mat>' being compiled
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(235): error C2131: expression did not evaluate to a constant
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(235): note: failure was caused by a read of a variable outside its lifetime
OpenCV-Contrib\modules\rgbd\src\dynafu.cpp(235): note: see usage of 'this'
The exact code that is failing is here:
float f[params.frameSize.width*params.frameSize.height];
Steps to reproduce
Compile with OpenGL and RGBD enabled.
float f[params.frameSize.width*params.frameSize.height]; is it really C++ https://en.cppreference.com/w/cpp/language/array ?
I also have the problem with
Severity Code Description Project File Line Suppression State Error C2131 expression did not evaluate to a constant opencv_rgbd
[234] - float f[params.frameSize.width*params.frameSize.height];
[235] - float pixels[params.frameSize.width*params.frameSize.height][3];
I also have the same problem. Error C2131 expression did not evaluate to a constant opencv_rgbd
If you don't need the RGB-Depth Processing module (that's where the error occurs) and just want to compile opencv on windows, just deactivate the extra module with -DBUILD_opencv_rgbd=OFF
during cmake-configure and you are good to go.
Problem is not easy to solve. You can use vector
1>dynafu.obj : error LNK2019: unresolved external symbol glBindRenderbufferEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z) 1>dynafu.obj : error LNK2019: unresolved external symbol glGenRenderbuffersEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z) 1>dynafu.obj : error LNK2019: unresolved external symbol glRenderbufferStorageEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z) 1>dynafu.obj : error LNK2019: unresolved external symbol glBindFramebufferEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z) 1>dynafu.obj : error LNK2019: unresolved external symbol glGenFramebuffersEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z) 1>dynafu.obj : error LNK2019: unresolved external symbol glFramebufferRenderbufferEXT referenced in function "public: __cdecl cv::dynafu::DynaFuImpl<class cv::Mat>::DynaFuImpl<class cv::Mat>(struct cv::dynafu::Params const &)" (??0?$DynaFuImpl@VMat@cv@@@dynafu@cv@@QEAA@AEBUParams@12@@Z)
This module is not compatible with windows and msvc. It is not available in 3.4 branch
I have encountered what seems to be a related problem, when compiling under Linux.
When OPENCV_ENABLE_NONFREE is set, and OpenGL_GL_PREFERENCE is set to GLVND (newer OpenGL), the build fails, with reference to libopencv_rgbd:
../../lib/libopencv_rgbd.so.4.2.0: undefined reference to `glRenderbufferStorageEXT' etc...
But if OpenGL_GL_PREFERENCE is set to LEGACY, there is no error.
Also have the problem:dynafu.cpp:181:26: error: 'glGenRenderbuffersEXT' was not declared in this scope glGenRenderbuffersEXT(1, &fbo_depth);
Reopening... Fix #2679 handles Windows case only, we need similar approach for Linux platform too.
Just adding the 'diff' from GArik's pull to my 4.4.0 release build appears to have fixed the issue on my Jetson nano (running linux).
Confirmed building on Ubuntu 22.04, patch by @GArik works fine
Trying to build OpenCV-4.7.0 and met this same issue.
It looks patch by @GArik works okay for this specific problem. However, I still cannot figure out this issue ...
If you don't need the RGB-Depth Processing module (that's where the error occurs) and just want to compile opencv on windows, just deactivate the extra module with
-DBUILD_opencv_rgbd=OFF
during cmake-configure and you are good to go.
As you said, I solved this issue by Turn OFF rgbd. Thank you ...