千家信息网

如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最
千家信息网最后更新 2025年02月04日如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试

如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

最近在研究某摄像头,通过USB插入到Arm64的板子上进行安装调试,这里尝试着把过程记录下来。

1 下载SDK

从官网上下载相应系统和版本的SDK,我这里是Linux-ARM64版本的,下载的是 OpenNI-Linux-Arm64-2.3.0.66 。或者wget链接地址

proxychains4 wget https://abzg-oss.oss-cn-shenzhen.aliyuncs.com/files/OpenNI-Linux-Arm64-2.3.0.66.zip[proxychains] config file found: /etc/proxychains.conf[proxychains] preloading /usr/local/lib/libproxychains4.so[proxychains] DLL init: proxychains-ng 4.14--2021-02-08 20:57:26--  https://abzg-oss.oss-cn-shenzhen.aliyuncs.com/files/OpenNI-Linux-Arm64-2.3.0.66.zip正在解析主机 abzg-oss.oss-cn-shenzhen.aliyuncs.com (abzg-oss.oss-cn-shenzhen.aliyuncs.com)... 224.0.0.1正在连接 abzg-oss.oss-cn-shenzhen.aliyuncs.com (abzg-oss.oss-cn-shenzhen.aliyuncs.com)|224.0.0.1|:443... [proxychains] Strict chain  ...  172.18.6.135:8001  ...  abzg-oss.oss-cn-shenzhen.aliyuncs.com:443  ...  OK已连接。已发出 HTTP 请求,正在等待回应... 200 OK长度: 3758034 (3.6M) [application/zip]正在保存至: "OpenNI-Linux-Arm64-2.3.0.66.zip"OpenNI-Linux-Arm64-2.3.0.66.zip       100%[===================================>]   3.58M  7.57MB/s    in 0.5s2021-02-08 20:57:27 (7.57 MB/s) - 已保存 "OpenNI-Linux-Arm64-2.3.0.66.zip" [3758034/3758034])

解压,目录结构如下

-rw-rw-r--  1 work work  9753 Sep 29 16:54 CHANGES.txt-rw-rw-r--  1 work work 11358 Sep 29 16:54 LICENSE-rw-rw-r--  1 work work 31653 Sep 29 16:54 NOTICE-rw-rw-r--  1 work work  5615 Sep 29 16:54 READMEdrwxrwxr-x  3 work work  4096 Jan 12 15:52 Redist-rw-rw-r--  1 work work  1863 Sep 29 16:54 ReleaseNotes.txtdrwxrwxr-x 12 work work  4096 Jan 12 15:52 Samplesdrwxrwxr-x  3 work work  4096 Jan 12 15:52 Toolsdrwxrwxr-x  8 work work  4096 Jan 12 15:52 include-rw-rw-r--  1 work work  2138 Mar 10  2020 install.sh-rw-rw-r--  1 work work  1221 Sep 29 16:54 orbbec-usb.rules

阅读README文件,其中

0 OpenNI-Linux-Arm64-2.3.0.66 > cat READMEOpenNI------Website: http://structure.io/openniBuilding Prerequisites======================...Linux------ GCC 4.x    From: http://gcc.gnu.org/releases.html    Or via apt:    sudo apt-get install g++- Python 2.6+/3.x    From: http://www.python.org/download/    Or via apt:    sudo apt-get install python- LibUSB 1.0.x    From: http://sourceforge.net/projects/libusb/files/libusb-1.0/    Or via apt:    sudo apt-get install libusb-1.0-0-dev- LibUDEV    sudo apt-get install libudev-dev- JDK 6.0    From: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html    Or via apt:    sudo apt-get install openjdk-6-jdk- FreeGLUT3    From: http://freeglut.sourceforge.net/index.php#download    Or via apt:    sudo apt-get install freeglut3-dev- Doxygen    From: http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc    Or via apt:    sudo apt-get install doxygen- GraphViz    From: http://www.graphviz.org/Download_linux_ubuntu.php    Or via apt:    sudo apt-get install graphviz...Building========Building on Windows:  Open the solution OpenNI.slnBuilding on Linux / OS X:  Run:  $ makeCross-Compiling for ARM on Linux:  The following environment variables should be defined:  - ARM_CXX=  - ARM_STAGING=  Then, run:  $ PLATFORM=Arm makeBuilding for Android:  - Create a workspace in eclipse  - Import all projects under root directoryCreating OpenNI2 Package========================- Go into the directory 'Packaging'- Run ReleaseVersion.py [x86|x64|Arm|Android]- Installer will be placed in the 'Final' directoryBuilding in an armhf qemu-enabled docker container==================================================- Note: we're building from the osrf fork which has a couple of minor tweaks compared to the orbbec upstream repo (https://github.com/orbbec/OpenNI2/compare/orbbec-dev...osrf:orbbec-dev?expand=1):  - don't force soft-float in third-party software (because we're building with hard-float)  - disable documentation generation (because we don't need it, and also because doxygen seems to just hang in this environment).- Check out the code (because git doesn't work inside qemu):  $ git clone https://github.com/osrf/OpenNI2  $ cd OpenNI2  $ git checkout orbbec-dev  $ cd ..- Start docker, mounting in the git repo:  $ docker run -ti -v `pwd`/OpenNI2:/tmp/OpenNI2 osrf/ubuntu_armhf:trusty bash- Now inside docker, install prereqs (we're removing udev because it somehow conflicts with libudev-dev; we're leaving out doxygen and graphviz because we're not going to build docs):  # apt-get update  # apt-get remove -y --force-yes udev  # apt-get install -y build-essential python libusb-1.0-0-dev libudev-dev openjdk-6-jdk freeglut3-dev- Still inside docker, build the release package (note that, instead of running `ReleaseVersion.py` inside `Packaging`, you could just run `make HAS_JAVA=1 release` at the top level):  # cd /tmp/OpenNI2/Packaging  # ./ReleaseVersion.py Arm- If all goes well, there will be a file in the docker container called something like `/tmp/OpenNI2/Packaging/Final/OpenNI-Linux-Arm-2.3.tar.bz2`.  It's also in the corresponding place in the host filesystem, so it will survive exiting the container. That file contains the compiled libraries (importantly, `OpenNI-Linux-Arm-2.3/Redist/libOpenNI2.so`).

这里指明了一些软件运行所需的依赖和安装方法,这里就不再赘述。后续的 building 等不是必须的操作。

2 配置

在解压后的目录中,执行 install.sh 文件

sudo sh install.sh

该脚本一共做了两件事,为摄像头设备增加UDEV规则,把开发环境写到 OpenNIDevEnvironment文件中。

cat OpenNIDevEnvironmentexport OPENNI2_INCLUDE=/home/work/abc/OpenNI-Linux-Arm64-2.3.0.65/Includeexport OPENNI2_REDIST=/home/work/abc/OpenNI-Linux-Arm64-2.3.0.65/Redist

注意第一个环境变量的Include,实际的目录名称为 include,记得改过来(要么把目录名称改成大写,要么把环境变量改成小写,我这里是选择改环境变量。)

然后再进行加载使其生效。

source OpenNIDevEnvironment

检查一下

env | grep OPENNI2_INCLUDEOPENNI2_INCLUDE=/home/work/abc/OpenNI-Linux-Arm64-2.3.0.66/include

3 测试

在Samples目录下,我们可以看到很多样例

drwxrwxr-x  3 work work 4096 Jan 20 22:10 Bindrwxrwxr-x  2 work work 4096 Jan 20 22:10 ClosestPointViewerdrwxrwxr-x  2 work work 4096 Jan 20 22:10 EventBasedReaddrwxrwxr-x  2 work work 4096 Jan 20 22:10 MWClosestPointdrwxrwxr-x  2 work work 4096 Jan 20 22:10 MWClosestPointAppdrwxrwxr-x  2 work work 4096 Jan 20 22:10 MultiDepthViewerdrwxrwxr-x  3 work work 4096 Feb  8 17:28 MultipleStreamReaddrwxrwxr-x  3 work work 4096 Jan 21 20:06 SimpleReaddrwxrwxr-x  3 work work 4096 Jan 27 10:59 SimpleViewerdrwxrwxr-x  3 work work 4096 Jan 20 22:10 SimpleViewer.java

我们就以SimpleRead为例,来测试一下。进入目录,结构如下:

总用量 52drwxrwxr-x  2 work work 4096 Jan 12 15:52 .drwxrwxr-x 12 work work 4096 Jan 12 15:52 ..-rw-rw-r--  1 work work 5080 Mar 10  2020 CommonCppMakefile-rw-rw-r--  1 work work 1710 Mar 10  2020 CommonDefs.mak-rw-rw-r--  1 work work  538 Mar 10  2020 CommonTargets.mak-rw-rw-r--  1 work work  631 Mar 10  2020 Makefile-rw-rw-r--  1 work work 3535 Mar 10  2020 OniSampleUtilities.h-rw-rw-r--  1 work work  493 Mar 10  2020 Platform.Arm-rw-rw-r--  1 work work  521 Mar 10  2020 Platform.Arm64-rw-rw-r--  1 work work  150 Mar 10  2020 Platform.x64-rw-rw-r--  1 work work  531 Mar 10  2020 Platform.x86-rw-rw-r--  1 work work 3500 Mar 10  2020 main.cpp

3.1 Makefile

include CommonDefs.makBIN_DIR = BinINC_DIRS = \        ../../Include \        ../CommonSRC_FILES = *.cppUSED_LIBS += OpenNI2EXE_NAME = SimpleReadCFLAGS += -Wallifndef OPENNI2_INCLUDE    $(error OPENNI2_INCLUDE is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation)else ifndef OPENNI2_REDIST    $(error OPENNI2_REDIST is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation)endifINC_DIRS += $(OPENNI2_INCLUDE)include CommonCppMakefile.PHONY: copy-redistcopy-redist:        cp -R $(OPENNI2_REDIST)/* $(OUT_DIR)$(OUTPUT_FILE): copy-redist

把 INC_DIRS 中的 ../../Include \ 改成实际的 ../../include \,而 ../Common 目录其实并不存在,也可以注释掉。

3.2 源码

main.cpp 文件

/******************************************************************************                                                                            **  OpenNI 2.x Alpha                                                          **  Copyright (C) 2012 PrimeSense Ltd.                                        **                                                                            **  This file is part of OpenNI.                                              **                                                                            **  Licensed under the Apache License, Version 2.0 (the "License");           **  you may not use this file except in compliance with the License.          **  You may obtain a copy of the License at                                   **                                                                            **      http://www.apache.org/licenses/LICENSE-2.0                            **                                                                            **  Unless required by applicable law or agreed to in writing, software       **  distributed under the License is distributed on an "AS IS" BASIS,         **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  **  See the License for the specific language governing permissions and       **  limitations under the License.                                            **                                                                            ******************************************************************************/#include #include #include "OniSampleUtilities.h"#define SAMPLE_READ_WAIT_TIMEOUT 2000 //2000msusing namespace openni;int main(int argc, char* argv[]){        Status rc = OpenNI::initialize();        if (rc != STATUS_OK)        {                printf("Initialize failed\n%s\n", OpenNI::getExtendedError());                return 1;        }        Device device;    if (argc < 2)        rc = device.open(ANY_DEVICE);    else        rc = device.open(argv[1]);    if (rc != STATUS_OK)        {                printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());                return 2;        }        VideoStream depth;        if (device.getSensorInfo(SENSOR_DEPTH) != NULL)        {                rc = depth.create(device, SENSOR_DEPTH);                if (rc != STATUS_OK)                {                        printf("Couldn't create depth stream\n%s\n", OpenNI::getExtendedError());                        return 3;                }        }        rc = depth.start();        if (rc != STATUS_OK)        {                printf("Couldn't start the depth stream\n%s\n", OpenNI::getExtendedError());                return 4;        }        VideoFrameRef frame;        while (!wasKeyboardHit())        {                int changedStreamDummy;                VideoStream* pStream = &depth;                rc = OpenNI::waitForAnyStream(&pStream, 1, &changedStreamDummy, SAMPLE_READ_WAIT_TIMEOUT);                if (rc != STATUS_OK)                {                        printf("Wait failed! (timeout is %d ms)\n%s\n", SAMPLE_READ_WAIT_TIMEOUT, OpenNI::getExtendedError());                        continue;                }                rc = depth.readFrame(&frame);                if (rc != STATUS_OK)                {                        printf("Read failed!\n%s\n", OpenNI::getExtendedError());                        continue;                }                if (frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_1_MM && frame.getVideoMode().getPixelFormat() != PIXEL_FORMAT_DEPTH_100_UM)                {                        printf("Unexpected frame format\n");                        continue;                }                DepthPixel* pDepth = (DepthPixel*)frame.getData();                int middleIndex = (frame.getHeight()+1)*frame.getWidth()/2;                printf("[llu] %8d\n", (long long)frame.getTimestamp(), pDepth[middleIndex]);        }        depth.stop();        depth.destroy();        device.close();        OpenNI::shutdown();        return 0;}

其实是将镜头中心的点所获取到的深度信息不断地进行输出。

3.3 编译

make

输出

mkdir -p Bin/Intermediate/Arm64-Release/SimpleReadg++ -MD -MP -MT "./Bin/Intermediate/Arm64-Release/SimpleRead/main.d Bin/Intermediate/Arm64-Release/SimpleRead/main.o" -c -march=armv8-a -O3 -fno-tree-pre -fno-strict-aliasing -ftree-vectorize -ffast-math -funsafe-math-optimizations  -flax-vector-conversions -Wall -O2 -DNDEBUG -I../../include -I/home/work/abc/OpenNI-Linux-Arm64-2.3.0.66/include -DXN_NEON -fPIC -fvisibility=hidden -Werror -o Bin/Intermediate/Arm64-Release/SimpleRead/main.o main.cppmkdir -p Bin/Arm64-Releasecp -R /home/work/abc/OpenNI-Linux-Arm64-2.3.0.66/Redist/* Bin/Arm64-Releaseg++ -o Bin/Arm64-Release/SimpleRead ./Bin/Intermediate/Arm64-Release/SimpleRead/main.o  -LBin/Arm64-Release -lOpenNI2 -Wl,-rpath ./

会发现目录下多了一个 Bin 目录

├── Bin│   ├── Arm64-Release│   │   ├── OpenNI.ini│   │   ├── OpenNI2│   │   ├── SimpleRead│   │   ├── libDepthUtils.a│   │   ├── libOpenNI2.so│   │   └── libSonixCamera.a│   └── Intermediate│       └── Arm64-Release├── CommonCppMakefile├── CommonDefs.mak├── CommonTargets.mak├── Makefile├── OniSampleUtilities.h├── Platform.Arm├── Platform.Arm64├── Platform.x64├── Platform.x86└── main.cpp

3.4 执行

0 SimpleRead > ./Bin/Arm64-Release/SimpleReadWarning: USB events thread - failed to set priority. This might cause loss of data...[00000000]     3501[00033688]     3501[00067376]     3537[00101065]     3501[00303195]     3501[00336884]     3537[00370572]     3501[00404261]     3501...

可以看到,这里就输出了深度信息。

至此,我们就把OpenNI在Linux/Ubuntu16.04-Arm64上安装成功了。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0