diff --git a/3rdparty/orbbecsdk/orbbecsdk.cmake b/3rdparty/orbbecsdk/orbbecsdk.cmake index db51aee9c4..8833a30d5a 100644 --- a/3rdparty/orbbecsdk/orbbecsdk.cmake +++ b/3rdparty/orbbecsdk/orbbecsdk.cmake @@ -1,18 +1,34 @@ +ocv_update(ORBBEC_SDK_VERSION "2") +ocv_update(ORBBEC_SDK_DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/3rdparty/orbbecsdk") + function(download_orbbec_sdk root_var) - set(ORBBECSDK_DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/3rdparty/orbbecsdk") - set(ORBBECSDK_FILE_HASH_CMAKE "e7566fa915a1b0c02640df41891916fe") - ocv_download(FILENAME "v1.9.4.tar.gz" - HASH ${ORBBECSDK_FILE_HASH_CMAKE} - URL "https://github.com/orbbec/OrbbecSDK/archive/refs/tags/v1.9.4/" - DESTINATION_DIR ${ORBBECSDK_DOWNLOAD_DIR} + if(ORBBEC_SDK_VERSION STREQUAL "1") + set(ORBBEC_SDK_FILE_HASH_CMAKE "e7566fa915a1b0c02640df41891916fe") + set(ORBBEC_SDK_GIT_TAG "1.9.4") + add_definitions(-DORBBEC_SDK_VERSION_MAJOR=1) + elseif(ORBBEC_SDK_VERSION STREQUAL "2") + set(ORBBEC_SDK_FILE_HASH_CMAKE "d828ac15618a56b9ae325bada8676e28") + set(ORBBEC_SDK_GIT_TAG "2.5.5") + add_definitions(-DORBBEC_SDK_VERSION_MAJOR=2) + else() + message(STATUS "Unsupported OrbbecSDK version: ${ORBBEC_SDK_VERSION}, use default version 2") + set(ORBBEC_SDK_FILE_HASH_CMAKE "d828ac15618a56b9ae325bada8676e28") + set(ORBBEC_SDK_GIT_TAG "2.5.5") + add_definitions(-DORBBEC_SDK_VERSION_MAJOR=2) + endif() + + ocv_download(FILENAME "v${ORBBEC_SDK_GIT_TAG}.tar.gz" + HASH ${ORBBEC_SDK_FILE_HASH_CMAKE} + URL "https://github.com/orbbec/OrbbecSDK/archive/refs/tags/v${ORBBEC_SDK_GIT_TAG}/" + DESTINATION_DIR ${ORBBEC_SDK_DOWNLOAD_DIR} ID OrbbecSDK STATUS res UNPACK RELATIVE_URL ) if(${res}) - message(STATUS "orbbec sdk downloaded to: ${ORBBECSDK_DOWNLOAD_DIR}") - set(${root_var} "${ORBBECSDK_DOWNLOAD_DIR}/OrbbecSDK-1.9.4" PARENT_SCOPE) + message(STATUS "OrbbecSDK downloaded to: ${ORBBEC_SDK_DOWNLOAD_DIR}") + set(${root_var} "${ORBBEC_SDK_DOWNLOAD_DIR}/OrbbecSDK-${ORBBEC_SDK_GIT_TAG}" PARENT_SCOPE) else() - message(FATAL_ERROR "Failed to download orbbec sdk") + message(FATAL_ERROR "Failed to download OrbbecSDK") endif() endfunction() \ No newline at end of file diff --git a/doc/tutorials/app/orbbec_uvc.markdown b/doc/tutorials/app/orbbec_uvc.markdown index 214ef6afc7..a5d62c5ec3 100644 --- a/doc/tutorials/app/orbbec_uvc.markdown +++ b/doc/tutorials/app/orbbec_uvc.markdown @@ -34,6 +34,15 @@ make sudo make install ``` +By default, when `-DOBSENSOR_USE_ORBBEC_SDK=ON` is enabled, OrbbecSDK v2 is used (i.e., `ORBBEC_SDK_VERSION` defaults to `2`); it supports the entire Orbbec Gemini 330 series. + +If you need legacy cameras such as Orbbec Femto, Gemini2XL, or Astra+, switch to OrbbecSDK v1 with the flag `-DORBBEC_SDK_VERSION=1`: +```bash + cmake -DOBSENSOR_USE_ORBBEC_SDK=ON -DORBBEC_SDK_VERSION=1 .. + make -j + sudo make install +``` + Code ---- diff --git a/modules/videoio/cmake/detect_obsensor.cmake b/modules/videoio/cmake/detect_obsensor.cmake index c7e6164c0f..0fa41481d9 100644 --- a/modules/videoio/cmake/detect_obsensor.cmake +++ b/modules/videoio/cmake/detect_obsensor.cmake @@ -13,8 +13,12 @@ if(NOT HAVE_OBSENSOR) set(HAVE_OBSENSOR TRUE) set(HAVE_OBSENSOR_ORBBEC_SDK TRUE) ocv_add_external_target(obsensor "${OrbbecSDK_INCLUDE_DIRS}" "${OrbbecSDK_LIBRARY}" "HAVE_OBSENSOR;HAVE_OBSENSOR_ORBBEC_SDK") - file(COPY ${OrbbecSDK_DLL_FILES} DESTINATION ${CMAKE_BINARY_DIR}/bin) file(COPY ${OrbbecSDK_DLL_FILES} DESTINATION ${CMAKE_BINARY_DIR}/lib) + if(NOT ORBBEC_SDK_VERSION STREQUAL "1") + # OrbbecSDK v2 loads some libraries at runtime. + file(COPY ${OrbbecSDK_RUNTIME_RESOURCE_FILES} DESTINATION ${CMAKE_BINARY_DIR}/lib) + install(DIRECTORY ${OrbbecSDK_RUNTIME_RESOURCE_FILES} DESTINATION ${OPENCV_LIB_INSTALL_PATH}) + endif() install(FILES ${OrbbecSDK_DLL_FILES} DESTINATION ${OPENCV_LIB_INSTALL_PATH}) ocv_install_3rdparty_licenses(OrbbecSDK ${OrbbecSDK_DIR}/LICENSE.txt) endif() diff --git a/modules/videoio/src/cap_obsensor_liborbbec.cpp b/modules/videoio/src/cap_obsensor_liborbbec.cpp index 3337d6f3ba..d8b44cf196 100644 --- a/modules/videoio/src/cap_obsensor_liborbbec.cpp +++ b/modules/videoio/src/cap_obsensor_liborbbec.cpp @@ -38,6 +38,9 @@ VideoCapture_obsensor::VideoCapture_obsensor(int, const cv::VideoCaptureParamete ob::Context::setLoggerToFile(OB_LOG_SEVERITY_OFF, ""); config = std::make_shared(); pipe = std::make_shared(); +#if ORBBEC_SDK_VERSION_MAJOR != 1 + alignFilter = std::make_shared(OB_STREAM_COLOR); +#endif int color_width = params.get(CAP_PROP_FRAME_WIDTH, OB_WIDTH_ANY); int color_height = params.get(CAP_PROP_FRAME_HEIGHT, OB_HEIGHT_ANY); @@ -75,12 +78,25 @@ VideoCapture_obsensor::VideoCapture_obsensor(int, const cv::VideoCaptureParamete config->enableStream(depthProfile->as()); } +#if ORBBEC_SDK_VERSION_MAJOR == 1 config->setAlignMode(ALIGN_D2C_SW_MODE); +#else + config->setFrameAggregateOutputMode(OB_FRAME_AGGREGATE_OUTPUT_ALL_TYPE_FRAME_REQUIRE); + pipe->enableFrameSync(); +#endif pipe->start(config, [&](std::shared_ptr frameset) { std::unique_lock lk(videoFrameMutex); +#if ORBBEC_SDK_VERSION_MAJOR == 1 colorFrame = frameset->colorFrame(); depthFrame = frameset->depthFrame(); +#else + auto alignFrameSet = alignFilter->process(frameset); + if (alignFrameSet) { + colorFrame = alignFrameSet->as()->colorFrame(); + depthFrame = alignFrameSet->as()->depthFrame(); + } +#endif }); auto param = pipe->getCameraParam(); diff --git a/modules/videoio/src/cap_obsensor_liborbbec.hpp b/modules/videoio/src/cap_obsensor_liborbbec.hpp index aa8c1d4728..d280d846e5 100644 --- a/modules/videoio/src/cap_obsensor_liborbbec.hpp +++ b/modules/videoio/src/cap_obsensor_liborbbec.hpp @@ -59,6 +59,9 @@ protected: std::shared_ptr grabbedDepthFrame; std::shared_ptr pipe; std::shared_ptr config; +#if ORBBEC_SDK_VERSION_MAJOR != 1 + std::shared_ptr alignFilter; +#endif CameraParam camParam; };