温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-22 11:59:05 来源:亿速云 阅读:430 作者:柒染 栏目:大数据

如何进行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.5s

2021-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 README
drwxrwxr-x  3 work work  4096 Jan 12 15:52 Redist
-rw-rw-r--  1 work work  1863 Sep 29 16:54 ReleaseNotes.txt
drwxrwxr-x 12 work work  4096 Jan 12 15:52 Samples
drwxrwxr-x  3 work work  4096 Jan 12 15:52 Tools
drwxrwxr-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 README
OpenNI
------

Website: http://structure.io/openni

Building 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.sln

Building on Linux / OS X:
  Run:
  $ make

Cross-Compiling for ARM on Linux:
  The following environment variables should be defined:
  - ARM_CXX=<path to cross-compilation g++>
  - ARM_STAGING=<path to cross-compilation staging dir>
  Then, run:
  $ PLATFORM=Arm make

Building for Android:
  - Create a workspace in eclipse
  - Import all projects under root directory

Creating OpenNI2 Package
========================
- Go into the directory 'Packaging'
- Run ReleaseVersion.py [x86|x64|Arm|Android]
- Installer will be placed in the 'Final' directory

Building 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 OpenNIDevEnvironment
export OPENNI2_INCLUDE=/home/work/abc/OpenNI-Linux-Arm64-2.3.0.65/Include
export OPENNI2_REDIST=/home/work/abc/OpenNI-Linux-Arm64-2.3.0.65/Redist

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

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

source OpenNIDevEnvironment

检查一下

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

3 测试

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

drwxrwxr-x  3 work work 4096 Jan 20 22:10 Bin
drwxrwxr-x  2 work work 4096 Jan 20 22:10 ClosestPointViewer
drwxrwxr-x  2 work work 4096 Jan 20 22:10 EventBasedRead
drwxrwxr-x  2 work work 4096 Jan 20 22:10 MWClosestPoint
drwxrwxr-x  2 work work 4096 Jan 20 22:10 MWClosestPointApp
drwxrwxr-x  2 work work 4096 Jan 20 22:10 MultiDepthViewer
drwxrwxr-x  3 work work 4096 Feb  8 17:28 MultipleStreamRead
drwxrwxr-x  3 work work 4096 Jan 21 20:06 SimpleRead
drwxrwxr-x  3 work work 4096 Jan 27 10:59 SimpleViewer
drwxrwxr-x  3 work work 4096 Jan 20 22:10 SimpleViewer.java

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

总用量 52
drwxrwxr-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.mak

BIN_DIR = Bin

INC_DIRS = \
	../../Include \
	../Common

SRC_FILES = *.cpp

USED_LIBS += OpenNI2

EXE_NAME = SimpleRead

CFLAGS += -Wall


ifndef 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)
endif

INC_DIRS += $(OPENNI2_INCLUDE)

include CommonCppMakefile

.PHONY: copy-redist
copy-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 <stdio.h>
#include <OpenNI.h>

#include "OniSampleUtilities.h"

#define SAMPLE_READ_WAIT_TIMEOUT 2000 //2000ms

using 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("[%08llu] %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/SimpleRead
g++ -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.cpp
mkdir -p Bin/Arm64-Release
cp -R /home/work/abc/OpenNI-Linux-Arm64-2.3.0.66/Redist/* Bin/Arm64-Release
g++ -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/SimpleRead
Warning: 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上安装成功了。

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI