From 918256997f8efc94a275b086da46ef660ae2936a Mon Sep 17 00:00:00 2001 From: zhonghong Date: Tue, 30 Jan 2024 16:27:04 +0800 Subject: [PATCH 1/4] add Overviewer Document --- doc/tutorial/English/OverviewDocument.md | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/doc/tutorial/English/OverviewDocument.md b/doc/tutorial/English/OverviewDocument.md index 117d1ce9..9934659b 100644 --- a/doc/tutorial/English/OverviewDocument.md +++ b/doc/tutorial/English/OverviewDocument.md @@ -1,26 +1,26 @@ # Overview -Welcome to the Orbbec SDK (hereinafter referred to as "SDK") tutorial! The SDK not only provides a concise high-level API, but also a flexible and comprehensive low-level API to help you use and quickly understand Orbbec 3D cameras in detail. +Welcome to the Orbbec SDK (hereinafter referred to as "SDK") tutorial! The SDK not only provides a concise high-level API, but also a flexible and comprehensive low-level API to help you use and quickly understand Orbbec 3D cameras in detail. # Features Orbbec SDK is a cross-platform (Windows, Android, Linux) software development kit that provides device parameter configuration, data stream reading and stream processing for 3D sensing cameras such as Orbbec structured light, binocular, and iToF. **Core functions:** -- Depth camera access and related parameter settings -- RGB camera access and related parameter settings (eg exposure and white balance) -- Sensor access and related parameter settings (eg gyroscope and accelerometer) -- Frame synchronization and alignment control -- Point cloud data -- Algorithmic capabilities such as filtering -- Multi-OS and Wrapper support. +- Depth camera access and related parameter settings +- RGB camera access and related parameter settings (eg exposure and white balance) +- Sensor access and related parameter settings (eg gyroscope and accelerometer) +- Frame synchronization and alignment control +- Point cloud data +- Algorithmic capabilities such as filtering +- Multi-OS and Wrapper support. **Highlights:** -SDK design goals: thin + flexible + high scalability. +SDK design goals: thin + flexible + high scalability. -- "Thin": Provides the ability to obtain device data at the minimum level and high performance -- "Flexible": Modular sensor function, flexible combination of different devices -- "Highly Scalable": Supports increasingly diversified devices and systems, and plug-in algorithms for different scenarios +- "Thin": Provides the ability to obtain device data at the minimum level and high performance +- "Flexible": Modular sensor function, flexible combination of different devices +- "Highly Scalable": Supports increasingly diversified devices and systems, and plug-in algorithms for different scenarios What's included in the SDK: @@ -51,50 +51,50 @@ The realization of the core business logic framework. **Platform abstraction layer** -Cross-platform components shield the implementation of different operating systems and provide a unified access method. +Cross-platform components shield the implementation of different operating systems and provide a unified access method. **Platform implementation layer** The driver implementation of each platform. -# SDK Frame Acquisition Sequence Diagram +# SDK Frame Acquisition Sequence Diagram ![OrbbecSDK Get Frame Sequence Diagram](Image/OrbbecSDK-Get-Frame-Sequence-Diagram.png) Note: The interfaces labeled with numbers are external interfaces, while the ones without numbers are internal interfaces. -# SDK Concepts +# SDK Concepts -**Context** +**Context** Context which provides a set of settings includes settings such as device state change callbacks, log levels, and more. The Context can access multiple devices. -**Device** +**Device** One actual hardware device corresponds to one Device object, which is used to obtain relevant information of the device and control its attributes. -**Sensor** +**Sensor** A Sensor can be understood as a sub-device of the actual device, corresponding to Color Sensor, IR Sensor, Depth Sensor, IMU Sensor, etc. One Device can contain multiple Sensors. -**Stream** +**Stream** Stream represents a data flow. Generally, a Sensor can output one or more types of data flows, which are composed of a series of time-sequenced Frames. For Stream, StreamProfile is used to describe the configuration of an individual stream. -**Frame** +**Frame** Represents a frame of data in the Stream, and also contains relevant information about that frame of data, such as timestamp, type, etc. -**FrameSet** +**FrameSet** Represents a combination of different types of Frames with the same timestamp, such as a combination of Color Frame and Depth Frame. -**Pipeline** +**Pipeline** The HighLevel corresponding object encapsulates the interface for quick access to the SDK. It has simple functions that allow users to quickly get started and use the SDK. -**Filter** +**Filter** It mainly refers to some algorithmic processing modules for the composite stream FrameSet, such as point cloud algorithm processing. From efb2c1a786049f79ce4e46509b15f21072ca02c9 Mon Sep 17 00:00:00 2001 From: zhonghong Date: Wed, 31 Jan 2024 15:46:26 +0800 Subject: [PATCH 2/4] update readme --- README.md | 4 +++- README_CN.md | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 031d9086..d501a785 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ The Orbbec 3D camera product software development kit fully supports UVC, enabli Additionally, this SDK is compatible with Orbbec's original OpenNI protocol devices through built-in code, enabling developers to migrate to Orbbec SDK to support both new and old products with one set of code. + +If you are a user in China, it is recommended to use Gitee([gitee Repo](https://gitee.com/orbbecdeveloper/OrbbecSDK)). + ## What is included in the repository * **library** : Orbbec SDK core library files and C/C++ header files. @@ -161,4 +164,3 @@ target_link_libraries(${PROJECT_NAME} OrbbecSDK::OrbbecSDK) * [Orbbec SDK Repo](https://github.com/orbbec/OrbbecSDK) * [Orbbec Main Page](https://www.orbbec.com/) * [Orbbec 3D Club](https://3dclub.orbbec3d.com) -* [gitee Repo](https://gitee.com/orbbecdeveloper/OrbbecSDK) diff --git a/README_CN.md b/README_CN.md index d0eed728..0bfdadf1 100644 --- a/README_CN.md +++ b/README_CN.md @@ -6,6 +6,8 @@ Orbbec 3D 相机产品软件开发套件,全面支持 UVC,实现免驱动即 此外,该 SDK 通过内置代码兼容 Orbbec 原有的 OpenNI 协议设备,开发者可以完全迁移到 OrbbecSDK,一套代码即可支持 Orbbec 的新一代产品和老产品。 +如果你是中国的用户,建议使用 Gitee([gitee Repo](https://gitee.com/orbbecdeveloper/OrbbecSDK))。 + ## 本仓库包含内容 * **library** : OrbbecSDK 核心库文件和 C/C++ 头文件。 @@ -147,4 +149,3 @@ target_link_libraries(${PROJECT_NAME} OrbbecSDK::OrbbecSDK) * [奥比中光主页](https://www.orbbec.com.cn/) * [3D 视觉开发者社区](https://developer.orbbec.com.cn/) -* [gitee 仓库](https://gitee.com/orbbecdeveloper/OrbbecSDK) From f3445b924dce6c374e51115782edc5620fa896ec Mon Sep 17 00:00:00 2001 From: Joe Dong Date: Fri, 2 Feb 2024 09:06:02 +0800 Subject: [PATCH 3/4] Fixed install OrbbecSDK.pc.in --- CMakeLists.txt | 14 +++++++++++++- OrbbecSDK.pc.in | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec426a6d..0986683c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.1.15) -project(OrbbecSDK VERSION 1.9.3 LANGUAGES C CXX) +project(OrbbecSDK VERSION 1.9.4 LANGUAGES C CXX) # Determine host platform include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/DetermineHostPlatform.cmake) @@ -94,6 +94,18 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) # project is used "${CMAKE_CURRENT_BINARY_DIR}/OrbbecSDKConfigVersion.cmake" DESTINATION lib/ ) + # OrbbecSDK.pc.in + if((UNIX)) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/OrbbecSDK.pc.in" + "${CMAKE_CURRENT_BINARY_DIR}/OrbbecSDK.pc" + @ONLY + ) + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/OrbbecSDK.pc" + DESTINATION lib/pkgconfig/ + ) + endif() # Uninstall target include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/UninstallTarget.cmake) diff --git a/OrbbecSDK.pc.in b/OrbbecSDK.pc.in index 0de9aee2..8e6cb235 100644 --- a/OrbbecSDK.pc.in +++ b/OrbbecSDK.pc.in @@ -5,6 +5,6 @@ includedir=${prefix}/include Name: OrbbecSDK Description: OrbbecSDK is a comprehensive library that provides developers with intuitive interfaces to control and manipulate Orbbec cameras seamlessly. -Version: 1.9.4 +Version: @PROJECT_VERSION@ Libs: -L${libdir} -lOrbbecSDK -Cflags: -I${includedir} \ No newline at end of file +Cflags: -I${includedir} From 3c799ca9b36d59ffff8e7b7444abbd5c800023fe Mon Sep 17 00:00:00 2001 From: zhonghong Date: Sun, 4 Feb 2024 09:26:11 +0800 Subject: [PATCH 4/4] add windows driver ev signature --- misc/driver/SensorDriver_V4.3.0.22.exe | Bin 4427598 -> 4438960 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/misc/driver/SensorDriver_V4.3.0.22.exe b/misc/driver/SensorDriver_V4.3.0.22.exe index ef796081857463cbc7a626c04495d6027d3d14dc..10a7436fa1e0665455f0e99abbb3865667a6c898 100644 GIT binary patch delta 11755 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 avbuMQA5w`~jb^%{xny*}od7E$qW=NypX;*# delta 296 zcmWl|HxhzS06;-Lm~+lKXHm=qa6*Rl1vGi!Yf`SUbnOBISFNv0qRnJn}@H=eI2`kNXe)&t&}o