Search code examples
c++visual-studioopencvlinkerrealsense

OpenCV + Realsense : Visual Studio Link 2019 error


I can't integrate OpenCV with the Intel Realsense Viewer source code.

Notes: I'm currently on a Windows 10.

I'm using visual studio 2017. msvc 14.12

The opencv version is 3.4.1 (windows pack) that's the version that is pre built for you.

I built and installed the intel realsense sdk from github. This was successful. I also built and successfully install the OpenCV examples using openCV I downloaded .

The problem comes when I try and link OpenCV to the realsense viewer project

The steps I followed to try and link openCV to the Intel Realsense Viewer:

  1. open the intel realsense sdk solution in visual studio (that's the .sln called librealsense2)

  2. go to the realsense-vewier project inside the 'solution explorer' panel inside visual studio

  3. right click on the project 'realsense-viewer' and then select properties

  4. make sure the 2 drop down boxes above have 'x64' and 'all configurations'

  5. Go to the C/C++ -> General option (from the left white box) and then go to 'Additional Include Directories'

  6. Add in the directory %OpenCVDownloadRoot%/build/include and %OpenCVDownloadRoot%/build/include/opencv (this is the configuration of the example OpenCV projects

Now at this point, some functions from openCV weren't being linked properly inside the 'realsense-viewer' project (which is weird because the work in the OpenCV projects in the SDK, even though the properties are the same. The errors were as follows: enter image description here

So then I followed some extra steps to see if I can get this to work.

  1. Inside the properties dialog box (the one we were just in) instead of selecting C/C++, select 'Linker'

  2. in the 'Additional Libraries Directories' selection, add in %OpenCVDownloadRoot%/build/x64/vc15/lib

  3. inside the 'Linker' properties, search for Input (Linker -> Input)

  4. add in 'opencv_world341d.lib' inside the 'Additional Dependencies' selection.

Now we get a completely different error: enter image description here

Now the realsense libraries aren't being recognised. No other properties were modified except for the above. I can confirm that step 10 causes all of these errors. Even if I reverse the actions of step 10 after performing all the steps, the above error still remains -> this must be a visual studio bug.

Any help or hints on how I can get OpenCV 3.4.1 + realsense-viewer (from the SDK) working inside visual studio 2017?

EDIT: I have already read: What is an undefined reference/unresolved external symbol error and how do I fix it?

But I have properly linked glfw and all of the other stuff that needs to be linked in order for the error message to go away. I believe the problem may be a bug that intel has, or a bug that vs has which requires a workaround


Solution

  • Solution found after taking a nice walk in the park( assuming you are using windows 10, visual studio 2017 for the project):

    go into your local librealsense project folder

    go to C:\Users\yourName\to\your\local\realsense\folder\librealsense\tools\CMakeLists.txt

    Add this to the end of the file:

    find_package(OpenCV REQUIRED)

    list(APPEND DEPENDENCIES realsense2 ${OpenCV_LIBS})

    so that the entire file is this:

    minimum required cmake version: 3.1.0 cmake_minimum_required(VERSION 3.1.0)

    project(RealsenseTools)

    Save the command line compile commands in the build output set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

    View the makefile commands during build

    set(CMAKE_VERBOSE_MAKEFILE on)

    This parameter is meant for disabling graphical examples when building for

    save-to-disk targets. option(BUILD_GRAPHICAL_EXAMPLES "Build graphical examples." ON)

    include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") endif()

    if(BUILD_GRAPHICAL_EXAMPLES) find_package(OpenGL) if(NOT OPENGL_FOUND) message(FATAL_ERROR "\n\n OpenGL package is missing!\n\n") endif()

    set(DEPENDENCIES realsense2 ${OPENGL_LIBRARIES})
    
    if(WIN32)
        list(APPEND DEPENDENCIES glfw3)
    else()
        # Find glfw header
        find_path(GLFW_INCLUDE_DIR NAMES GLFW/glfw3.h
            PATHS /usr/X11R6/include
                  /usr/include/X11
                  /opt/graphics/OpenGL/include
                  /opt/graphics/OpenGL/contrib/libglfw
                  /usr/local/include
                  /usr/include/GL
                  /usr/include
        )
        # Find glfw library
        find_library(GLFW_LIBRARIES NAMES glfw glfw3
                PATHS /usr/lib64
                      /usr/lib
                      /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
                      /usr/local/lib64
                      /usr/local/lib
                      /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
                      /usr/X11R6/lib
        )
        if(APPLE)
            find_library(COCOA_LIBRARY Cocoa)
            find_library(IOKIT_LIBRARY IOKit)
            find_library(COREVIDEO_LIBRARY CoreVideo)
            LIST(APPEND DEPENDENCIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
        endif()
        list(APPEND DEPENDENCIES m ${GLFW_LIBRARIES} ${LIBUSB1_LIBRARIES})
        include_directories(${GLFW_INCLUDE_DIR})
    endif() else()
    set(DEPENDENCIES realsense2)
    if(NOT WIN32)
        list(APPEND DEPENDENCIES m ${LIBUSB1_LIBRARIES})
    endif() endif()
    

    allow this project to access opencv find_package(OpenCV REQUIRED)

    find_package(OpenCV REQUIRED) set(DEPENDENCIES realsense2 ${OpenCV_LIBS})

    add_subdirectory(terminal) add_subdirectory(fw-logger) add_subdirectory(enumerate-devices) add_subdirectory(realsense-viewer) add_subdirectory(data-collect) add_subdirectory(depth-quality) add_subdirectory(rosbag-inspector)

    Then rebuild the project using cmake gui