I have the Jetson NX, and I tried the last couple of days to install OpenCV, and am still fighting it. But we’re going to give it a few rounds.
Let’s see, so I used DustyNV’s Dockerfile with an OpenCV setup for 4.4 or 4.5.
But the build dies, or is still missing libraries. There’s a bunch of them, and as I’m learning, everything is a linker issue. Everything. sudo ldconfig.
Here’s a 2019 quora answer to “What is sudo ldconfig in linux?”
“ldconfig updates the cache for the linker in a UNIX environment with libraries found in the paths specified in “/etc/ld.so.conf”. sudo executes it with superuser rights so that it can write to “/etc/ld.so.cache”.
You usually use this if you get errors about some dynamically linked libraries not being found when starting a program although they are actually present on the system. You might need to add their paths to “/etc/ld.so.conf” first, though.” – Marcel Noe
So taking my own advice, let’s see:
chicken@chicken:/etc/ld.so.conf.d$ find | xargs cat $1 cat: .: Is a directory /opt/nvidia/vpi1/lib64 /usr/local/cuda-10.2/targets/aarch64-linux/lib # Multiarch support /usr/local/lib/aarch64-linux-gnu /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu/libfakeroot # libc default configuration /usr/local/lib /usr/lib/aarch64-linux-gnu/tegra /usr/lib/aarch64-linux-gnu/fakechroot /usr/lib/aarch64-linux-gnu/tegra-egl /usr/lib/aarch64-linux-gnu/tegra
Ok. On our host (Jetson), let’s see if we can install it, or access it. It’s Jetpack 4.6.1 so it should have it installed already.
ImportError: libblas.so.3: cannot open shared object file: No such file or directory cd /usr/lib/aarch64-linux-gnu/ ls -l liblas.so* libblas.so -> /etc/alternatives/libblas.so-aarch64-linux-gnu cd /etc/alternatives ls -l liblas.so* libblas.so.3-aarch64-linux-gnu -> /usr/lib/aarch64-linux-gnu/atlas/libblas.so.3 libblas.so-aarch64-linux-gnu -> /usr/lib/aarch64-linux-gnu/atlas/libblas.so
Let’s see that location…
chicken@chicken:/usr/lib/aarch64-linux-gnu/atlas$ ls -l total 22652 libblas.a libblas.so -> libblas.so.3.10.3 libblas.so.3 -> libblas.so.3.10.3 libblas.so.3.10.3 liblapack.a liblapack.so -> liblapack.so.3.10.3 liblapack.so.3 -> liblapack.so.3.10.3 liblapack.so.3.10.3
And those are shared objects.
So why do we get ‘libblas.so.3: cannot open shared object file: No such file or directory?’
So let’s try
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev gfortran
Sounds promising. Ha it worked. chicken@chicken:/usr/lib/aarch64-linux-gnu/atlas$ python3 Python 3.6.9 (default, Dec 8 2021, 21:08:43) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>>
Now let’s try fix DustyNV’s Dockerfile. Oops right, it takes forever to build things, or even to download and install them. So try not to change things early on in the install. So besides, Dusty’s setup already has these being installed. So it’s not that it’s not there. It’s some linking issue.
Ok I start up the NV docker and try import cv2, but
admin@chicken:/workspaces/isaac_ros-dev$ python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 96, in <module> bootstrap() File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 86, in bootstrap import cv2 ImportError: libtesseract.so.4: cannot open shared object file: No such file or directory
So where is that file?
admin@chicken:/usr/lib/aarch64-linux-gnu$ find | grep tess | xargs ls -l $1 -rw-r--r-- 1 root root 6892600 Apr 7 2018 ./libtesseract.a lrwxrwxrwx 1 root root 21 Apr 7 2018 ./libtesseract.so -> libtesseract.so.4.0.0 -rw-r--r-- 1 root root 481 Apr 7 2018 ./pkgconfig/tesseract.pc
Well indeed, that plainly doesn’t exist?
admin@chicken:/$ sudo apt-get install libtesseract-dev Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: libarchive13 librhash0 libuv1 Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: libleptonica-dev The following NEW packages will be installed: libleptonica-dev libtesseract-dev 0 upgraded, 2 newly installed, 0 to remove and 131 not upgraded. Need to get 2,666 kB of archives. After this operation, 14.1 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libleptonica-dev arm64 1.75.3-3 [1,251 kB] Get:2 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libtesseract-dev arm64 4.00~git2288-10f4998a-2 [1,415 kB] Fetched 2,666 kB in 3s (842 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libleptonica-dev. dpkg: warning: files list file for package 'libcufft-10-2' missing; assuming package has no files currently installed dpkg: warning: files list file for package 'cuda-cudart-10-2' missing; assuming package has no files currently installed (Reading database ... 97997 files and directories currently installed.) Preparing to unpack .../libleptonica-dev_1.75.3-3_arm64.deb ... Unpacking libleptonica-dev (1.75.3-3) ... Selecting previously unselected package libtesseract-dev. Preparing to unpack .../libtesseract-dev_4.00~git2288-10f4998a-2_arm64.deb ... Unpacking libtesseract-dev (4.00~git2288-10f4998a-2) ... Setting up libleptonica-dev (1.75.3-3) ... Setting up libtesseract-dev (4.00~git2288-10f4998a-2) ...
ImportError: libtesseract.so.4: cannot open shared object file: No such file or directory
admin@chicken:/$ echo $LD_LIBRARY_PATH /opt/ros/foxy/install/opt/yaml_cpp_vendor/lib:/opt/ros/foxy/install/lib:/usr/lib/aarch64-linux-gnu/tegra-egl:/usr/local/cuda-10.2/targets/aarch64-linux/lib:/usr/lib/aarch64-linux-gnu/tegra:/opt/nvidia/vpi1/lib64:/usr/local/cuda-10.2/targets/aarch64-linux/lib::/opt/tritonserver/lib
So this sounds like a linker issue to me. We tell the linker where things are, it finds them.
admin@chicken:/$ export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu/atlas/:/usr/lib/aarch64-linux-gnu:/usr/lib/aarch64-linux-gnu/lapack:$LD_LIBRARY_PATH admin@chicken:/$ sudo ldconfig
Ok, would be bad to have too much hope now. Let’s see… no, of course it didn’t work.
So let’s see what libleptonica and libtesseract-dev set up
./usr/lib/aarch64-linux-gnu/libtesseract.so ./usr/lib/aarch64-linux-gnu/libtesseract.a ./usr/lib/aarch64-linux-gnu/pkgconfig/tesseract.pc And it wants admin@chicken:/$ ls -l ./usr/lib/aarch64-linux-gnu/libtesseract.so lrwxrwxrwx 1 root root 21 Apr 7 2018 ./usr/lib/aarch64-linux-gnu/libtesseract.so -> libtesseract.so.4.0.0 and yeah it's installed. Start-Date: 2022-04-15 14:03:03 Commandline: apt-get install libtesseract-dev Requested-By: admin (1000) Install: libleptonica-dev:arm64 (1.75.3-3, automatic), libtesseract-dev:arm64 (4.00~git2288-10f4998a-2) End-Date: 2022-04-15 14:03:06
This guy has a smart idea, to install them, which is pretty clever. But I tried that already, and tesseract’s build failed, of course. Then it complains about undefined references to jpeg,png,TIFF,zlib,etc. Hmm. All that shit is installed.
/usr/lib/gcc/aarch64-linux-gnu/8/../../../aarch64-linux-gnu/liblept.a(libversions.o): In function `getImagelibVersions': (.text+0x98): undefined reference to `jpeg_std_error' (.text+0x158): undefined reference to `png_get_libpng_ver' (.text+0x184): undefined reference to `TIFFGetVersion' (.text+0x1f0): undefined reference to `zlibVersion' (.text+0x21c): undefined reference to `WebPGetEncoderVersion' (.text+0x26c): undefined reference to `opj_version'
But so here’s the evidence: cv2 is looking for libtesseract.so.4, which doesn’t exist at all. And even if we symlinked it to point to the libtesseract.so file, that just links to libtesseract.so.4.0.0 which is empty.
Ah. Ok I had to sudo apt-get install libtesseract-dev
on the Jetson host, not inside the docker!!. Hmm. Right. Cause I’m sharing most of the libs on the host anyway. It’s gotta be on the host.
admin@chicken:/usr/lib/aarch64-linux-gnu$ ls -l *tess* -rw-r--r-- 1 root root 6892600 Apr 7 2018 libtesseract.a lrwxrwxrwx 1 root root 21 Apr 7 2018 libtesseract.so -> libtesseract.so.4.0.0 lrwxrwxrwx 1 root root 21 Apr 7 2018 libtesseract.so.4 -> libtesseract.so.4.0.0 -rw-r--r-- 1 root root 3083888 Apr 7 2018 libtesseract.so.4.0.0 admin@chicken:/usr/lib/aarch64-linux-gnu$ python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> exit() Success.
So now back to earlier, we were trying to run jupyter lab, to try run the camera calibration code again. I added the installation to the dockerfile. So this command starts it up at http://chicken:8888/lab (or name of your computer).
jupyter lab --ip 0.0.0.0 --port 8888 --allow-root &
Needed matplotlib, so just did quick macro install: %pip install matplotlib ModuleNotFoundError: No module named 'matplotlib' Note: you may need to restart the kernel to use updated packages. K... restart kernel. Kernel -> Restart.
Ok now I’m going to try calibrate the stereo cameras, since OpenCV is back.
Seems after some successes, the cameras are not creating capture sessions anymore, even from the host. Let’s reboot.
Alright, new topic. Calibrating stereo cameras.