update OrbbecSDK version to 2.8.7

This commit is contained in:
ob-yalian
2026-05-23 15:04:11 +08:00
parent edb0ee91a6
commit fbe49dfca5
24 changed files with 409 additions and 14 deletions
@@ -226,9 +226,10 @@ OB_EXPORT bool ob_device_preset_list_has_preset(const ob_device_preset_list *pre
* @return bool Returns true if the device supports the frame interleave feature.
*/
OB_EXPORT bool ob_device_is_frame_interleave_supported(const ob_device *device, ob_error **error);
/**
*
* @brief load the frame interleave mode according to frame interleavee name.
* @brief load the frame interleave mode according to frame interleave name.
*
* @param[in] device The device object.
* @param[in] frame_interleave_name The name should be one of the frame interleave names returned by @ref ob_device_get_available_frame_interleave_list.
@@ -236,6 +237,19 @@ OB_EXPORT bool ob_device_is_frame_interleave_supported(const ob_device *device,
*/
OB_EXPORT void ob_device_load_frame_interleave(ob_device *device, const char *frame_interleave_name, ob_error **error);
/**
*
* @brief Get current frame interleave name.
*
* @param[in] device The device object.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*
* @return const char* return the current frame interleave name.
* Returns an empty string ("") if no interleave is loaded.
* Returns nullptr if an error occurs.
*/
OB_EXPORT const char *ob_device_get_current_frame_interleave_name(const ob_device *device, ob_error **error);
/**
* @brief Get the available frame interleave list.
*
@@ -281,6 +281,30 @@ OB_EXPORT void ob_log_external_message(ob_log_severity severity, const char *mod
*/
OB_EXPORT void ob_set_extensions_directory(const char *directory, ob_error **error);
/**
* @brief Set the host-side timestamp clock type for the current context.
*
* @attention All ob::Context instances share the same underlying SDK runtime and clock type.
* @attention Switching affects frame system and global timestamps; avoid switching during streaming.
* @attention It is recommended to synchronize device timestamps after switching.
*
* @param[in] context Pointer to the context object
* @param[in] clock_type The clock type to use for host-side timestamps
* @param[out] error Pointer to an error object that will be populated if an error occurs
*/
OB_EXPORT void ob_context_set_timestamp_clock_type(ob_context *context, ob_clock_type clock_type, ob_error **error);
/**
* @brief Get the current host-side timestamp clock type for the context.
*
* @param[in] context Pointer to the context object
* @param[out] error Pointer to an error object that will be populated if an error occurs
*
* @return ob_clock_type The current clock type
*/
OB_EXPORT ob_clock_type ob_context_get_timestamp_clock_type(const ob_context *context, ob_error **error);
// The following interfaces are deprecated and are retained here for compatibility purposes.
#define ob_enable_multi_device_sync ob_enable_device_clock_sync
#define ob_set_logger_callback ob_set_logger_to_callback
@@ -2030,6 +2030,15 @@ typedef enum {
} ob_ip_source_type,
OBIpSourceType;
/**
* @brief Host-side timestamp clock type for device.
*/
typedef enum {
OB_CLOCK_TYPE_REALTIME = 0, /**< Wall clock (system_clock), epoch-based. Default. */
OB_CLOCK_TYPE_MONOTONIC = 1, /**< System monotonic clock, non-epoch. */
} OBClockType,
ob_clock_type;
/**
* @brief Callback for file transfer
*
@@ -85,6 +85,33 @@ public:
Error::handle(&error, false);
}
/**
* @brief Set the host-side timestamp clock type for the current context.
*
* @attention All ob::Context instances share the same underlying SDK runtime and clock type.
* @attention Switching affects frame system and global timestamps; avoid switching during streaming.
* @attention It is recommended to synchronize device timestamps after switching.
*
* @param[in] type The clock type to use for host-side timestamps.
*/
void setTimestampClockType(OBClockType type) const {
ob_error *error = nullptr;
ob_context_set_timestamp_clock_type(impl_, type, &error);
Error::handle(&error);
}
/**
* @brief Get the current host-side timestamp clock type for the context.
*
* @return OBClockType The current clock type.
*/
OBClockType getTimestampClockType() const {
ob_error *error = nullptr;
auto type = ob_context_get_timestamp_clock_type(impl_, &error);
Error::handle(&error);
return type;
}
/**
* @brief Queries the enumerated device list.
*
@@ -839,6 +839,24 @@ public:
Error::handle(&error);
}
/**
*
* @brief Get current frame interleave name.
*
* @param[in] device The device object.
* @param[out] error Pointer to an error object that will be set if an error occurs.
*
* @return const char* return the current frame interleave name.
* Returns an empty string ("") if no interleave is loaded.
* Returns nullptr if an error occurs.
*/
OB_EXPORT const char *getCurrentFrameInterleaveName() const {
ob_error *error = nullptr;
auto name = ob_device_get_current_frame_interleave_name(impl_, &error);
Error::handle(&error);
return name;
}
/**
* @brief Get available frame interleave list
*
@@ -481,6 +481,97 @@ public:
}
};
/**
* @brief UnDistortionFilter removes lens distortion from a chosen stream (Color, IR, or Depth).
*
* Usage (pure color undistortion, sync_align scenario):
* @code
* auto filter = std::make_shared<ob::UnDistortionFilter>();
* // default stream type is COLOR, default mode is pure undistortion
* filter->pushFrame(frameSet);
* @endcode
*
* Usage (virtual-camera mode, hw_d2c_align scenario):
* @code
* auto filter = std::make_shared<ob::UnDistortionFilter>();
* // Pass the raw depth intrinsic — filter computes the scale to color resolution internally.
* filter->setNewCameraMatrix(depthIntrinsic);
* filter->pushFrame(frameSet);
* @endcode
*
* Usage (depth undistortion — must use nearest-neighbor interpolation):
* @code
* auto filter = std::make_shared<ob::UnDistortionFilter>(OB_STREAM_DEPTH);
* filter->setInterpolationMode(0); // nearest neighbor avoids ghost-depth artefacts
* @endcode
*/
class UnDistortionFilter : public Filter {
public:
explicit UnDistortionFilter(OBStreamType streamType = OB_STREAM_COLOR) {
ob_error *error = nullptr;
auto impl = ob_create_filter("UnDistortionFilter", &error);
Error::handle(&error);
init(impl);
setConfigValue("StreamType", static_cast<double>(streamType));
}
virtual ~UnDistortionFilter() noexcept override = default;
/**
* @brief Set which stream to undistort (default: OB_STREAM_COLOR).
* For depth streams, also call setInterpolationMode(0).
*/
void setStreamType(OBStreamType streamType) {
setConfigValue("StreamType", static_cast<double>(streamType));
}
OBStreamType getStreamType() const {
return static_cast<OBStreamType>(static_cast<int>(getConfigValue("StreamType")));
}
/**
* @brief Set the new camera matrix used to project the undistorted image
* (equivalent to OpenCV's `newCameraMatrix` argument in
* `cv::undistort(src, dst, cameraMatrix, distCoeffs, newCameraMatrix)`).
*
* Pass the raw depth camera intrinsic. The filter scales fx/fy/cx/cy from
* the depth resolution to the actual color frame resolution at process time,
* so the caller does NOT need to compute the scale factor.
*
* The new-camera-matrix mode is enabled as long as depthIntrinsic.width > 0.
* Call clearNewCameraMatrix() to return to pure undistortion.
*
* @param depthIntrinsic The depth camera intrinsic at its native resolution.
*/
void setNewCameraMatrix(OBCameraIntrinsic depthIntrinsic) {
setConfigValue("NewCameraFx", static_cast<double>(depthIntrinsic.fx));
setConfigValue("NewCameraFy", static_cast<double>(depthIntrinsic.fy));
setConfigValue("NewCameraCx", static_cast<double>(depthIntrinsic.cx));
setConfigValue("NewCameraCy", static_cast<double>(depthIntrinsic.cy));
setConfigValue("NewCameraWidth", static_cast<double>(depthIntrinsic.width));
setConfigValue("NewCameraHeight", static_cast<double>(depthIntrinsic.height));
}
/**
* @brief Clear the new camera matrix and return to pure undistortion.
*/
void clearNewCameraMatrix() {
setConfigValue("NewCameraWidth", 0.0);
}
/**
* @brief Set the pixel interpolation mode.
* @param mode 0 = nearest-neighbor (required for depth), 1 = bilinear (default).
*/
void setInterpolationMode(int mode) {
setConfigValue("InterpolationMode", static_cast<double>(mode));
}
int getInterpolationMode() const {
return static_cast<int>(getConfigValue("InterpolationMode"));
}
};
/**
* @brief The FormatConvertFilter class is a subclass of Filter that performs format conversion.
*/
@@ -1380,6 +1471,23 @@ public:
return range;
}
/**
* @brief Get the FalsePositive filter fpebfMinBleedLength range.
*
* @return OBUint16PropertyRange the fpebfMinBleedLength value of property range.
*/
OBUint16PropertyRange getfpebfMinBleedLengthRange() {
OBUint16PropertyRange range{};
const auto &schemaVec = getConfigSchemaVec();
for(const auto &item: schemaVec) {
if(strcmp(item.name, "fpebfMinBleedLength") == 0) {
range = getPropertyRange<OBUint16PropertyRange>(item, getConfigValue("fpebfMinBleedLength"));
break;
}
}
return range;
}
/**
* @brief Get the FalsePositive filter fpTextureSparsityFilterEnable range.
*
@@ -1617,6 +1725,74 @@ public:
}
return range;
}
/**
* @brief Get the FalsePositive filter fppafMaxWidthRatio range.
*
* @return OBFloatPropertyRange the fppafMaxWidthRatio value of property range.
*/
OBFloatPropertyRange getfppafMaxWidthRatioRange() {
OBFloatPropertyRange range{};
const auto &schemaVec = getConfigSchemaVec();
for(const auto &item: schemaVec) {
if(strcmp(item.name, "fppafMaxWidthRatio") == 0) {
range = getPropertyRange<OBFloatPropertyRange>(item, getConfigValue("fppafMaxWidthRatio"));
break;
}
}
return range;
}
/**
* @brief Get the FalsePositive filter fppafMaxHeightRatio range.
*
* @return OBFloatPropertyRange the fppafMaxHeightRatio value of property range.
*/
OBFloatPropertyRange getfppafMaxHeightRatioRange() {
OBFloatPropertyRange range{};
const auto &schemaVec = getConfigSchemaVec();
for(const auto &item: schemaVec) {
if(strcmp(item.name, "fppafMaxHeightRatio") == 0) {
range = getPropertyRange<OBFloatPropertyRange>(item, getConfigValue("fppafMaxHeightRatio"));
break;
}
}
return range;
}
/**
* @brief Get the FalsePositive filter fppafTolerance range.
*
* @return OBFloatPropertyRange the fppafTolerance value of property range.
*/
OBFloatPropertyRange getfppafToleranceRange() {
OBFloatPropertyRange range{};
const auto &schemaVec = getConfigSchemaVec();
for(const auto &item: schemaVec) {
if(strcmp(item.name, "fppafTolerance") == 0) {
range = getPropertyRange<OBFloatPropertyRange>(item, getConfigValue("fppafTolerance"));
break;
}
}
return range;
}
/**
* @brief Get the FalsePositive filter fppafScore range.
*
* @return OBUint16PropertyRange the fppafScore value of property range.
*/
OBUint16PropertyRange getfppafScoreRange() {
OBUint16PropertyRange range{};
const auto &schemaVec = getConfigSchemaVec();
for(const auto &item: schemaVec) {
if(strcmp(item.name, "fppafScore") == 0) {
range = getPropertyRange<OBUint16PropertyRange>(item, getConfigValue("fppafScore"));
break;
}
}
return range;
}
};
/**
@@ -2001,6 +2177,7 @@ inline const std::unordered_map<std::string, std::type_index> &getFilterTypeMap(
{ "FalsePositiveFilter", typeid(FalsePositiveFilter) },
{ "MgcNoiseRemovalFilter", typeid(MgcNoiseRemovalFilter) },
{ "LutNoiseRemovalFilter", typeid(LutNoiseRemovalFilter) },
{ "UnDistortionFilter", typeid(UnDistortionFilter) },
};
return filterTypeMap;
}
@@ -8,12 +8,12 @@ set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "ob::OrbbecSDK" for configuration "Release"
set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ob::OrbbecSDK PROPERTIES
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.6"
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.7"
IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2"
)
list(APPEND _cmake_import_check_targets ob::OrbbecSDK )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.6" )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.7" )
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
@@ -9,19 +9,19 @@
# The variable CVF_VERSION must be set before calling configure_file().
set(PACKAGE_VERSION "2.8.6")
set(PACKAGE_VERSION "2.8.7")
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
if("2.8.6" MATCHES "^([0-9]+)\\.")
if("2.8.7" MATCHES "^([0-9]+)\\.")
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
endif()
else()
set(CVF_VERSION_MAJOR "2.8.6")
set(CVF_VERSION_MAJOR "2.8.7")
endif()
if(PACKAGE_FIND_VERSION_RANGE)
@@ -1 +1 @@
libOrbbecSDK.so.2.8.6
libOrbbecSDK.so.2.8.7
@@ -8,12 +8,12 @@ set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "ob::OrbbecSDK" for configuration "Release"
set_property(TARGET ob::OrbbecSDK APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ob::OrbbecSDK PROPERTIES
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.6"
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.7"
IMPORTED_SONAME_RELEASE "libOrbbecSDK.so.2"
)
list(APPEND _cmake_import_check_targets ob::OrbbecSDK )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.6" )
list(APPEND _cmake_import_check_files_for_ob::OrbbecSDK "${_IMPORT_PREFIX}/lib/libOrbbecSDK.so.2.8.7" )
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
@@ -9,19 +9,19 @@
# The variable CVF_VERSION must be set before calling configure_file().
set(PACKAGE_VERSION "2.8.6")
set(PACKAGE_VERSION "2.8.7")
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
if("2.8.6" MATCHES "^([0-9]+)\\.")
if("2.8.7" MATCHES "^([0-9]+)\\.")
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
endif()
else()
set(CVF_VERSION_MAJOR "2.8.6")
set(CVF_VERSION_MAJOR "2.8.7")
endif()
if(PACKAGE_FIND_VERSION_RANGE)
+1 -1
View File
@@ -1 +1 @@
libOrbbecSDK.so.2.8.6
libOrbbecSDK.so.2.8.7
+126 -1
View File
@@ -82,7 +82,13 @@
<!-- GVCP port scheme: Standard = default port, SchemeB = custom port -->
<GVCPPortScheme>Standard</GVCPPortScheme>
<!-- Host-side clock type for device timestamps.
Options: Realtime, Monotonic.
Realtime: Wall clock (system_clock), epoch-based.
Monotonic: Monotonic clock, not tied to epoch. -->
<ClockSource>Realtime</ClockSource>
<!-- Gemini305 config -->
<Gemini305>
<!-- Default backend for Linux UVC devices. If the LinuxUVCBackend is set to "Auto,"
@@ -292,6 +298,125 @@
</RightIR>
</Gemini305g>
<!-- Gemini309g config -->
<Gemini309g>
<!-- The default Linux UVC backend. If the LinuxUVCBackend is set to "Auto," this item
will determine the device's speciality. Optional values: V4L2, LibUVC -->
<LinuxUVCDefaultBackend>LibUVC</LinuxUVCDefaultBackend>
<!-- Enable auto device reboot when a fatal XU channel IO error (LIBUSB_ERROR_IO) is
detected on the LibUVC backend. Set to true to enable; default is false. -->
<LinuxUVCAutoRebootOnFault>true</LinuxUVCAutoRebootOnFault>
<Misc>
<GlobalTimestampFitterEnable>true</GlobalTimestampFitterEnable>
<!-- Global timestamp fitter refresh interval, unit: milliseconds, default value:
1000,
minimum value: 100, it is recommended not to be greater than 1000 -->
<GlobalTimestampFitterInterval>1000</GlobalTimestampFitterInterval>
<!-- Global timestamp fitter queue size, default value: 100, minimum value: 20 -->
<GlobalTimestampFitterQueueSize>100</GlobalTimestampFitterQueueSize>
</Misc>
<DepthPostProcessing>
<HardwareNoiseRemoveFilter>true</HardwareNoiseRemoveFilter>
<SoftwareNoiseRemoveFilter>false</SoftwareNoiseRemoveFilter>
</DepthPostProcessing>
<!-- Whether to enable heartbeat by default -->
<DefaultHeartBeat>0</DefaultHeartBeat>
<!-- Whether to enable firmware upgrade foolproof by default, only internal version
supports -->
<FirmwareUpgradeFoolproof>1</FirmwareUpgradeFoolproof>
<Depth>
<!-- Number of retries for open stream failures, 0 means no retries -->
<StreamFailedRetry>1</StreamFailedRetry>
<!-- Open flow waits for the timeout period of the first frame of data, after which
the open flow will fail -->
<MaxStartStreamDelayMs>3000</MaxStartStreamDelayMs>
<!-- The maximum frame interval time, if this value is exceeded, it will be judged
that the stream is interrupted -->
<MaxFrameIntervalMs>6000</MaxFrameIntervalMs>
<!-- The resolution width is enabled by default, int type -->
<Width>848</Width>
<!-- High resolution is enabled by default, int type -->
<Height>530</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>Y16</Format>
</Depth>
<Color>
<!-- Number of retries for open stream failures, 0 means no retries -->
<StreamFailedRetry>1</StreamFailedRetry>
<!-- Open flow waits for the timeout period of the first frame of data, after which
the open flow will fail -->
<MaxStartStreamDelayMs>3000</MaxStartStreamDelayMs>
<!-- The maximum frame interval time, if this value is exceeded, it will be judged
that the stream is interrupted -->
<MaxFrameIntervalMs>6000</MaxFrameIntervalMs>
<!-- The resolution width is enabled by default, int type -->
<Width>848</Width>
<!-- High resolution is enabled by default, int type -->
<Height>530</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>YUYV</Format>
</Color>
<LeftColor>
<!-- Number of retries for open stream failures, 0 means no retries -->
<StreamFailedRetry>1</StreamFailedRetry>
<!-- Open flow waits for the timeout period of the first frame of data, after which
the open flow will fail -->
<MaxStartStreamDelayMs>3000</MaxStartStreamDelayMs>
<!-- The maximum frame interval time, if this value is exceeded, it will be judged
that the stream is interrupted -->
<MaxFrameIntervalMs>6000</MaxFrameIntervalMs>
<!-- The resolution width is enabled by default, int type -->
<Width>1280</Width>
<!-- High resolution is enabled by default, int type -->
<Height>800</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>YUYV</Format>
</LeftColor>
<RightColor>
<!-- Number of retries for open stream failures, 0 means no retries -->
<StreamFailedRetry>1</StreamFailedRetry>
<!-- Open flow waits for the timeout period of the first frame of data, after which
the open flow will fail -->
<MaxStartStreamDelayMs>3000</MaxStartStreamDelayMs>
<!-- The maximum frame interval time, if this value is exceeded, it will be judged
that the stream is interrupted -->
<MaxFrameIntervalMs>6000</MaxFrameIntervalMs>
<!-- The resolution width is enabled by default, int type -->
<Width>1280</Width>
<!-- High resolution is enabled by default, int type -->
<Height>800</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>YUYV</Format>
</RightColor>
<LeftIR>
<!-- The resolution width is enabled by default, int type -->
<Width>848</Width>
<!-- High resolution is enabled by default, int type -->
<Height>530</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>Y8</Format>
</LeftIR>
<RightIR>
<!-- The resolution width is enabled by default, int type -->
<Width>848</Width>
<!-- High resolution is enabled by default, int type -->
<Height>530</Height>
<!-- The frame rate of the resolution enabled by default, int type -->
<FPS>30</FPS>
<Format>Y8</Format>
</RightIR>
</Gemini309g>
<FemtoMega>
<!-- For Femto-Mega devices, it must be set to V4L2, LibUVC is not supported -->
<LinuxUVCDefaultBackend>V4L2</LinuxUVCDefaultBackend>
@@ -48,6 +48,7 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="081a", MODE:="066
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="081b", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini_338Le"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="081c", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini_338L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="081d", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini_331L"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2bc5", ATTRS{idProduct}=="0845", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="Gemini_309g"
# OpenNI Modules
SUBSYSTEM=="usb", ATTR{idProduct}=="0400", ATTR{idVendor}=="2bc5", MODE:="0666", OWNER:="root", GROUP:="video", SYMLINK+="astra_bootloader"