Repository for OpenCV's extra modules
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

274 lines
14 KiB

cmake_policy(SET CMP0079 NEW)
OCV_OPTION(OPENCV_V4D_ENABLE_ES3 "Enable OpenGL ES 3.0 backend for V4D" OFF
VERIFY HAVE_OPENGL)
include(FetchContent)
if(NOT EMSCRIPTEN)
find_package(glfw3 3 REQUIRED)
find_package(OpenCL REQUIRED)
include("FindOpenGL")
endif()
set(the_description "V4D Visualization Module")
set(OPENCV_MODULE_IS_PART_OF_WORLD OFF)
# Check CXX Features
get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
list (FIND known_features "cxx_std_20" idx)
if (${idx} LESS 0)
message(STATUS "Module opencv_v4d disabled because it requires C++20")
ocv_module_disable(v4d)
endif()
# Update submodules
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../.git")
# Update submodules as needed
message(STATUS "Submodule update")
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../"
RESULT_VARIABLE GIT_SUBMOD_RESULT)
if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}, please checkout submodules")
endif()
endif()
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/")
message(FATAL_ERROR "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.")
endif()
# Macro to download a file
macro(fetch_file download_name url hash)
FetchContent_Declare(${download_name}
URL ${url}
URL_HASH SHA256=${hash}
DOWNLOAD_NO_EXTRACT true
TLS_VERIFY true
)
FetchContent_MakeAvailable(${download_name})
endmacro(fetch_file)
# Macro to add a WebAssembly sample
macro(add_emscripten_sample sample source models)
if(NOT (TARGET ${sample}))
ocv_add_executable(${sample} ${source})
ocv_target_include_modules(${sample} opencv_core opencv_imgproc opencv_videoio opencv_video opencv_imgcodecs opencv_v4d opencv_face opencv_tracking opencv_objdetect opencv_stitching opencv_optflow opencv_imgcodecs opencv_features2d opencv_dnn opencv_flann)
ocv_target_link_libraries(${sample} opencv_v4d opencv_core opencv_imgproc opencv_videoio opencv_video opencv_imgcodecs opencv_v4d opencv_face opencv_tracking opencv_objdetect opencv_stitching opencv_optflow opencv_imgcodecs opencv_features2d opencv_dnn opencv_flann)
target_link_directories(${sample} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../../lib")
target_include_directories(${sample} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/opencv2/v4d/detail/" "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui" "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/backends/" "${CMAKE_CURRENT_SOURCE_DIR}/third/nanovg/src/")
target_compile_features(${sample} PRIVATE cxx_std_20)
set_target_properties(${sample} PROPERTIES SUFFIX ".js")
add_custom_command(
TARGET ${sample} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_LIST_DIR}/samples/${sample}.html"
"${CMAKE_CURRENT_BINARY_DIR}/../../bin/${sample}.html")
if(${models})
target_link_options(${sample} PRIVATE "SHELL:--preload-file ${CMAKE_CURRENT_BINARY_DIR}/assets/models/face_detection_yunet_2023mar.onnx")
target_link_options(${sample} PRIVATE "SHELL:--preload-file ${CMAKE_CURRENT_BINARY_DIR}/assets/models/lbfmodel.yaml")
endif()
endif()
endmacro()
# Macro to add a native sample
macro(add_binary_sample sample source)
if(NOT (TARGET ${sample}))
ocv_add_executable(${sample} ${source})
endif()
ocv_target_link_libraries(${sample} OpenGL GLEW glfw X11)
target_compile_features(${sample} PRIVATE cxx_std_20)
target_link_directories(${sample} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../../lib")
target_include_directories(${sample} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/opencv2/v4d/detail/" "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui" "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/backends/" "${CMAKE_CURRENT_SOURCE_DIR}/third/nanovg/src/")
endmacro()
# Configure emscripten build flags
if(EMSCRIPTEN)
set(EM_LINKER_FLAGS "-sENVIRONMENT=web,worker -sWASM_BIGINT=1 -sOFFSCREENCANVAS_SUPPORT -sOFFSCREENCANVASES_TO_PTHREAD=#v4dOffscreenCanvas -sEXPORTED_FUNCTIONS=_main,_v4dInitCapture -sEXPORTED_RUNTIME_METHODS=ccall -sPROXY_TO_PTHREAD=1 --use-preload-plugins --preload-file \"${CMAKE_CURRENT_BINARY_DIR}/assets/fonts/entypo.ttf\" --preload-file \"${CMAKE_CURRENT_BINARY_DIR}/assets/fonts/Roboto-Regular.ttf\" --preload-file \"${CMAKE_CURRENT_BINARY_DIR}/assets/fonts/Roboto-Bold.ttf\" --preload-file \"${CMAKE_CURRENT_BINARY_DIR}/doc/lena.png\" -sINITIAL_MEMORY=128MB -sALLOW_MEMORY_GROWTH=1 -sUSE_GLFW=3 -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 --bind")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EM_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EM_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_LINKER_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(EM_DEBUG_FLAGS "-s GL_DEBUG=1 -sSTACK_OVERFLOW_CHECK=2 -sASSERTIONS=2 -sNO_DISABLE_EXCEPTION_CATCHING -sEXCEPTION_DEBUG=1")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${EM_DEBUG_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${EM_DEBUG_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_DEBUG_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
endif()
#Configure NanoVG build options
if (NOT (TARGET nanovg))
set(NANOVG_BUILD_EXAMPLES OFF)
set(NANOVG_BUILD_GL2 OFF)
if(OPENCV_V4D_ENABLE_ES3 OR EMSCRIPTEN)
set(NANOVG_BUILD_GL3 OFF)
set(NANOVG_BUILD_GLES3 ON)
else()
set(NANOVG_BUILD_GL3 ON)
set(NANOVG_BUILD_GLES3 OFF)
endif()
set(NANOVG_BUILD_GLES2 OFF)
set(NANOVG_BUILD_OUI OFF)
set(NANOVG_BUILD_SVG OFF)
set(NANOVG_SHARED_LIBS ON)
set(NANOVG_USE_FREETYPE OFF)
set(NANOVG_USE_STB ON)
set(CMAKE_CXX_FLAGS "-Wno-error -pthread")
set(CMAKE_C_FLAGS "-Wno-error -pthread")
if(EMSCRIPTEN)
set(CMAKE_CXX_FLAGS "-pthread")
set(CMAKE_C_FLAGS "-pthread")
set(NANOVG_STATIC_LIBS ON)
else()
set(NANOVG_STATIC_LIBS OFF)
endif()
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/third/nanovg/")
target_include_directories(nanovg PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/third/")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/third/nanovg/src/")
if(OPENCV_V4D_ENABLE_ES3)
target_link_libraries(nanovg OpenGL::GLES3)
elseif(NOT EMSCRIPTEN)
target_link_libraries(nanovg OpenGL::OpenGL)
endif()
endif()
# Add the opencv module
if(NOT (TARGET ${the_module}))
ocv_add_module(v4d opencv_core opencv_imgproc opencv_videoio opencv_video)
ocv_glob_module_sources("${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/src/detail/" "${CMAKE_CURRENT_SOURCE_DIR}/include/opencv2/v4d" "${CMAKE_CURRENT_SOURCE_DIR}/include/opencv2/v4d/detail/")
ocv_module_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/third/imgui" "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/backends/" "${CMAKE_CURRENT_SOURCE_DIR}/third/nanovg/src/")
ocv_create_module()
ocv_add_samples(opencv_v4d opencv_core opencv_imgproc opencv_videoio opencv_video opencv_imgcodecs opencv_v4d opencv_face opencv_tracking opencv_objdetect opencv_stitching opencv_optflow opencv_imgcodecs opencv_features2d opencv_dnn opencv_flann)
set_target_properties(${the_module} PROPERTIES LINKER_LANGUAGE CXX)
# Add ImGui source files
file(GLOB imgui_sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/*.cpp")
file(GLOB imgui_backend_sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/backends/imgui_impl_opengl3*.cpp")
file(GLOB imgui_glfw_sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/third/imgui/backends/imgui_impl_glfw.cpp")
target_sources(${the_module} PUBLIC ${imgui_sources} ${imgui_backend_sources} ${imgui_glfw_sources})
# Populate assets
fetch_file("LBFMODEL" "https://github.com/kurnianggoro/GSOC2017/raw/master/data/lbfmodel.yaml" "70dd8b1657c42d1595d6bd13d97d932877b3bed54a95d3c4733a0f740d1fd66b")
fetch_file("YUNET" "https://github.com/opencv/opencv_zoo/raw/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx" "8f2383e4dd3cfbb4553ea8718107fc0423210dc964f9f4280604804ed2552fa4")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_BINARY_DIR}/assets")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_BINARY_DIR}/assets/doxygen")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_BINARY_DIR}/assets/models")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"${CMAKE_CURRENT_BINARY_DIR}/assets/fonts")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/samples/fonts/*.ttf"
"${CMAKE_CURRENT_BINARY_DIR}/assets/fonts/")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_LIST_DIR}/doc/lena.png"
"${CMAKE_CURRENT_BINARY_DIR}/doc/lena.png")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${lbfmodel_SOURCE_DIR}/lbfmodel.yaml"
"${CMAKE_CURRENT_BINARY_DIR}/assets/models/")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${yunet_SOURCE_DIR}/face_detection_yunet_2023mar.onnx"
"${CMAKE_CURRENT_BINARY_DIR}/assets/models/")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/third/doxygen-bootstrapped/customdoxygen.css"
"${CMAKE_SOURCE_DIR}/doc/stylesheet.css")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/third/doxygen-bootstrapped/example-site/header.html"
"${CMAKE_SOURCE_DIR}/doc/")
add_custom_command(TARGET ${the_module} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/third/doxygen-bootstrapped/example-site/footer.html"
"${CMAKE_SOURCE_DIR}/doc/")
list(APPEND CMAKE_DOXYGEN_HTML_FILES "${CMAKE_CURRENT_SOURCE_DIR}/third/doxygen-bootstrapped/doxy-boot.js")
#Add sample targets
if(BUILD_EXAMPLES)
if(EMSCRIPTEN)
add_emscripten_sample(example_v4d_display_image samples/display_image.cpp false)
add_emscripten_sample(example_v4d_display_image_fb samples/display_image_fb.cpp false)
add_emscripten_sample(example_v4d_display_image_nvg samples/display_image_nvg.cpp false)
add_emscripten_sample(example_v4d_vector_graphics samples/vector_graphics.cpp false)
add_emscripten_sample(example_v4d_vector_graphics_and_fb samples/vector_graphics_and_fb.cpp false)
add_emscripten_sample(example_v4d_render_opengl samples/render_opengl.cpp false)
add_emscripten_sample(example_v4d_custom_source_and_sink samples/custom_source_and_sink.cpp false)
add_emscripten_sample(example_v4d_font_rendering samples/font_rendering.cpp false)
add_emscripten_sample(example_v4d_font_with_gui samples/font_with_gui.cpp false)
add_emscripten_sample(example_v4d_video_editing samples/video_editing.cpp false)
add_emscripten_sample(example_v4d_cube-demo samples/cube-demo.cpp false)
add_emscripten_sample(example_v4d_many_cubes-demo samples/many_cubes-demo.cpp false)
add_emscripten_sample(example_v4d_video-demo samples/video-demo.cpp false)
add_emscripten_sample(example_v4d_nanovg-demo samples/nanovg-demo.cpp false)
add_emscripten_sample(example_v4d_font-demo samples/font-demo.cpp false)
add_emscripten_sample(example_v4d_shader-demo samples/shader-demo.cpp false)
add_emscripten_sample(example_v4d_pedestrian-demo samples/pedestrian-demo.cpp false)
add_emscripten_sample(example_v4d_optflow-demo samples/optflow-demo.cpp false)
add_emscripten_sample(example_v4d_beauty-demo samples/beauty-demo.cpp true)
else()
add_binary_sample(example_v4d_display_image samples/display_image.cpp)
add_binary_sample(example_v4d_display_image_fb samples/display_image_fb.cpp)
add_binary_sample(example_v4d_display_image_nvg samples/display_image_nvg.cpp)
add_binary_sample(example_v4d_vector_graphics samples/vector_graphics.cpp)
add_binary_sample(example_v4d_vector_graphics_and_fb samples/vector_graphics_and_fb.cpp)
add_binary_sample(example_v4d_render_opengl samples/render_opengl.cpp)
add_binary_sample(example_v4d_custom_source_and_sink samples/custom_source_and_sink.cpp)
add_binary_sample(example_v4d_font_rendering samples/font_rendering.cpp)
add_binary_sample(example_v4d_font_with_gui samples/font_with_gui.cpp)
add_binary_sample(example_v4d_video_editing samples/video_editing.cpp)
add_binary_sample(example_v4d_cube-demo samples/cube-demo.cpp)
add_binary_sample(example_v4d_many_cubes-demo samples/many_cubes-demo.cpp)
add_binary_sample(example_v4d_video-demo samples/video-demo.cpp)
add_binary_sample(example_v4d_nanovg-demo samples/nanovg-demo.cpp)
add_binary_sample(example_v4d_font-demo samples/font-demo.cpp)
add_binary_sample(example_v4d_shader-demo samples/shader-demo.cpp)
add_binary_sample(example_v4d_pedestrian-demo samples/pedestrian-demo.cpp)
add_binary_sample(example_v4d_optflow-demo samples/optflow-demo.cpp)
add_binary_sample(example_v4d_beauty-demo samples/beauty-demo.cpp)
endif()
endif()
if(OPENCV_V4D_ENABLE_ES3)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENCV_V4D_USE_ES3=1")
endif()
target_compile_features(${the_module} PRIVATE cxx_std_20)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-enum-enum-conversion)
target_link_directories(${the_module} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/../../lib")
if(EMSCRIPTEN)
ocv_target_link_libraries(${the_module} -lnanovg)
else()
ocv_target_link_libraries(${the_module} OpenCL OpenGL GLEW glfw -lnanovg)
endif()
endif()