OpenCV + CUDA on Jetson Nano

Hi! Ive been trying to modify some Gstreamer Plugins (mainly cvsmooth) so it does some other stuff too but mainly for it to be accelerated on the Jetson Nano’s GPU

Ive installed OpenCV 4.5 with CUDA support

pkg-config --modversion opencv
4.5.0

The plugin compiles with no problem but whenever i try to run it i get this:

GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/core/include/opencv2/core/private.cuda.hpp:107: error: (-216:No CUDA support) The library is compiled without CUDA support in function 'throw_no_cuda'

Seems the opencv-4.1.1 without CUDA support shipped with JetPack is used instead of your own opencv-4.5.0 build.

Your would build your plugin using:

-I <path_to_opencv-4.5.0>/include/opencv4
-L <path_to_opencv-4.5.0>/lib

or use pkg-config if it gives correct 4.5.0 flags.

Then, for execution, you would set environment variable LD_LIBRARY_PATH before running:

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:<path_to_opencv-4.5.0>/lib
gst-launch-1.0 <your pipeline_with_cvsmooth>

I still dont get it to work

I cloned and built opencv in the home directory and added it to LD_LIBRAY_PATH

echo $LD_LIBRARY_PATH                                    
/usr/local/cuda/lib64:/home/devkit/opencv/build/lib

Also i get this when i search for opencv libraries

dpkg -l | grep libopencv
ii  libopencv                                     4.1.1-2-gd5a58aa75                               arm64        Open Computer Vision Library
ii  libopencv-core3.2:arm64                       3.2.0+dfsg-4ubuntu0.1                            arm64        computer vision core library
ii  libopencv-dev                                 4.1.1-2-gd5a58aa75                               arm64        Development files for Open Source Computer Vision Library
ii  libopencv-python                              4.1.1-2-gd5a58aa75                               arm64        Python bindings for Open Source Computer Vision Library
ii  libopencv-samples                             4.1.1-2-gd5a58aa75                               arm64        Samples for Open Source Computer Vision Library

EDIT:
Contents of /home/devkit/opencv/build/lib

libade.a                         libopencv_cudafeatures2d.so.4.5.0  libopencv_dnn.so.4.5.0           libopencv_highgui.so.4.5.0              libopencv_photo.so.4.5.0             libopencv_superres.so.4.5.0
libopencv_alphamat.so            libopencv_cudafilters.so           libopencv_dnn_superres.so        libopencv_imgcodecs.so                  libopencv_plot.so                    libopencv_surface_matching.so
libopencv_alphamat.so.4.5        libopencv_cudafilters.so.4.5       libopencv_dnn_superres.so.4.5    libopencv_imgcodecs.so.4.5              libopencv_plot.so.4.5                libopencv_surface_matching.so.4.5
libopencv_alphamat.so.4.5.0      libopencv_cudafilters.so.4.5.0     libopencv_dnn_superres.so.4.5.0  libopencv_imgcodecs.so.4.5.0            libopencv_plot.so.4.5.0              libopencv_surface_matching.so.4.5.0
libopencv_aruco.so               libopencv_cudaimgproc.so           libopencv_dpm.so                 libopencv_img_hash.so                   libopencv_quality.so                 libopencv_text.so
libopencv_aruco.so.4.5           libopencv_cudaimgproc.so.4.5       libopencv_dpm.so.4.5             libopencv_img_hash.so.4.5               libopencv_quality.so.4.5             libopencv_text.so.4.5
libopencv_aruco.so.4.5.0         libopencv_cudaimgproc.so.4.5.0     libopencv_dpm.so.4.5.0           libopencv_img_hash.so.4.5.0             libopencv_quality.so.4.5.0           libopencv_text.so.4.5.0
libopencv_bgsegm.so              libopencv_cudalegacy.so            libopencv_face.so                libopencv_imgproc.so                    libopencv_rapid.so                   libopencv_tracking.so
libopencv_bgsegm.so.4.5          libopencv_cudalegacy.so.4.5        libopencv_face.so.4.5            libopencv_imgproc.so.4.5                libopencv_rapid.so.4.5               libopencv_tracking.so.4.5
libopencv_bgsegm.so.4.5.0        libopencv_cudalegacy.so.4.5.0      libopencv_face.so.4.5.0          libopencv_imgproc.so.4.5.0              libopencv_rapid.so.4.5.0             libopencv_tracking.so.4.5.0
libopencv_bioinspired.so         libopencv_cudaobjdetect.so         libopencv_features2d.so          libopencv_intensity_transform.so        libopencv_reg.so                     libopencv_videoio.so
libopencv_bioinspired.so.4.5     libopencv_cudaobjdetect.so.4.5     libopencv_features2d.so.4.5      libopencv_intensity_transform.so.4.5    libopencv_reg.so.4.5                 libopencv_videoio.so.4.5
libopencv_bioinspired.so.4.5.0   libopencv_cudaobjdetect.so.4.5.0   libopencv_features2d.so.4.5.0    libopencv_intensity_transform.so.4.5.0  libopencv_reg.so.4.5.0               libopencv_videoio.so.4.5.0
libopencv_calib3d.so             libopencv_cudaoptflow.so           libopencv_flann.so               libopencv_line_descriptor.so            libopencv_rgbd.so                    libopencv_video.so
libopencv_calib3d.so.4.5         libopencv_cudaoptflow.so.4.5       libopencv_flann.so.4.5           libopencv_line_descriptor.so.4.5        libopencv_rgbd.so.4.5                libopencv_video.so.4.5
libopencv_calib3d.so.4.5.0       libopencv_cudaoptflow.so.4.5.0     libopencv_flann.so.4.5.0         libopencv_line_descriptor.so.4.5.0      libopencv_rgbd.so.4.5.0              libopencv_video.so.4.5.0
libopencv_ccalib.so              libopencv_cudastereo.so            libopencv_freetype.so            libopencv_mcc.so                        libopencv_saliency.so                libopencv_videostab.so
libopencv_ccalib.so.4.5          libopencv_cudastereo.so.4.5        libopencv_freetype.so.4.5        libopencv_mcc.so.4.5                    libopencv_saliency.so.4.5            libopencv_videostab.so.4.5
libopencv_ccalib.so.4.5.0        libopencv_cudastereo.so.4.5.0      libopencv_freetype.so.4.5.0      libopencv_mcc.so.4.5.0                  libopencv_saliency.so.4.5.0          libopencv_videostab.so.4.5.0
libopencv_core.so                libopencv_cudawarping.so           libopencv_fuzzy.so               libopencv_ml.so                         libopencv_shape.so                   libopencv_xfeatures2d.so
libopencv_core.so.4.5            libopencv_cudawarping.so.4.5       libopencv_fuzzy.so.4.5           libopencv_ml.so.4.5                     libopencv_shape.so.4.5               libopencv_xfeatures2d.so.4.5
libopencv_core.so.4.5.0          libopencv_cudawarping.so.4.5.0     libopencv_fuzzy.so.4.5.0         libopencv_ml.so.4.5.0                   libopencv_shape.so.4.5.0             libopencv_xfeatures2d.so.4.5.0
libopencv_cudaarithm.so          libopencv_cudev.so                 libopencv_gapi.so                libopencv_objdetect.so                  libopencv_stereo.so                  libopencv_ximgproc.so
libopencv_cudaarithm.so.4.5      libopencv_cudev.so.4.5             libopencv_gapi.so.4.5            libopencv_objdetect.so.4.5              libopencv_stereo.so.4.5              libopencv_ximgproc.so.4.5
libopencv_cudaarithm.so.4.5.0    libopencv_cudev.so.4.5.0           libopencv_gapi.so.4.5.0          libopencv_objdetect.so.4.5.0            libopencv_stereo.so.4.5.0            libopencv_ximgproc.so.4.5.0
libopencv_cudabgsegm.so          libopencv_datasets.so              libopencv_hdf.so                 libopencv_optflow.so                    libopencv_stitching.so               libopencv_xobjdetect.so
libopencv_cudabgsegm.so.4.5      libopencv_datasets.so.4.5          libopencv_hdf.so.4.5             libopencv_optflow.so.4.5                libopencv_stitching.so.4.5           libopencv_xobjdetect.so.4.5
libopencv_cudabgsegm.so.4.5.0    libopencv_datasets.so.4.5.0        libopencv_hdf.so.4.5.0           libopencv_optflow.so.4.5.0              libopencv_stitching.so.4.5.0         libopencv_xobjdetect.so.4.5.0
libopencv_cudacodec.so           libopencv_dnn_objdetect.so         libopencv_hfs.so                 libopencv_phase_unwrapping.so           libopencv_structured_light.so        libopencv_xphoto.so
libopencv_cudacodec.so.4.5       libopencv_dnn_objdetect.so.4.5     libopencv_hfs.so.4.5             libopencv_phase_unwrapping.so.4.5       libopencv_structured_light.so.4.5    libopencv_xphoto.so.4.5
libopencv_cudacodec.so.4.5.0     libopencv_dnn_objdetect.so.4.5.0   libopencv_hfs.so.4.5.0           libopencv_phase_unwrapping.so.4.5.0     libopencv_structured_light.so.4.5.0  libopencv_xphoto.so.4.5.0
libopencv_cudafeatures2d.so      libopencv_dnn.so                   libopencv_highgui.so             libopencv_photo.so                      libopencv_superres.so                python3
libopencv_cudafeatures2d.so.4.5  libopencv_dnn.so.4.5               libopencv_highgui.so.4.5         libopencv_photo.so.4.5                  libopencv_superres.so.4.5

EDIT2:
Also i think this is important, since im modifying an existing plugin im using meson and ninja to build it. Im really new to meson and ninja, maybe im missing something there but i wouldnt know where to start.

When you’ve configured your opencv build with cmake, it has set CMAKE_INSTALL_PREFIX (for example /usr/local).
After building opencv, when you run:

sudo make install

…your opencv build will be installed at that location. pkg-config would use that location for opencv flags.
Check with:

pkg-config opencv4 --cflags --libs

I cannot tell about meson/ninja build.

I’m sure that if building your app or plugin with correct include paths and libs paths, and set these in LD_LIBRARY_PATH as you did it should work…for a C++ application or plugin.

Note that running from python may be different. If this is your case, try to display the opencv version that your python install uses:

python
Python 2.7.17 (default, Jul 20 2020, 15:37:01) 
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.4.0-pre

This is the output i get from pkg-config opencv4 --cflags --libs

-I/usr/include/opencv4/opencv -I/usr/include/opencv4 -lopencv_dnn -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopenc
v_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

And as far as python goes:

python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.5.0-pre

Looks ok so far, but you’ve installed into /usr where the opencv-4.1.1 was. Also noted some 3.2 version above. Did you purge before ?
I use to install into /usr/local/my-version to get rid of that.
What gives:

ls -l /usr/include/opencv4/opencv2
ls /usr/lib/libopencv*

if you see mixed files (dates in headers, or suffixs for libs), you would purge and reinstall.