matlab - |Ubuntu 18.04, opencv-3.4.0, MATLAB/R2018a| make 因对 cv::dnn::eperimental 的 undefined reference 而失败

标签 matlab opencv build installation mex

我已按照维基步骤安装 mexopencv ,但出现以下错误:

$ make MATLABDIR=/usr/local/MATLAB/R2018a WITH_CONTRIB=true all contrib    

/tmp/mex_17713079591682_20541/Net_.o: In function `mexFunction':
    Net_.cpp:(.text+0x10dd): undefined reference to `cv::dnn::experimental_dnn_v3::Net::Net()'
    Net_.cpp:(.text+0x11ac): undefined reference to `cv::dnn::experimental_dnn_v3::readNetFromCaffe(cv::String const&, cv::String const&)'
    Net_.cpp:(.text+0x122a): undefined reference to `cv::dnn::experimental_dnn_v3::Net::~Net()'
    .. and so on

如果我看到要在 opencv 中构建什么,模块 dnn 存在,这让我感到奇怪。

-- General configuration for OpenCV 3.4.0 =====================================

--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dpm face features2d flann freetype fuzzy hdf highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    js python2 python3 world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv dnn_modern java matlab ovis sfm ts viz

内置模块:

$ pkg-config --cflags --libs opencv
-I/usr/local/include/opencv ..etc.. -lopencv_dnn .. etc

当前的 opencv 版本是:

$ pkg-config --modversion opencv
3.4.0

问题是;有没有办法通过禁用/取消链接 dnn 来解决/解决此问题?

或者我如何实际编译使该引用正常工作所需的 dnn 文件?

{edit 1} 文件实际编译于:

$ ls /usr/local/include/opencv2/
...
bioinspired      dnn             fuzzy         imgproc              optflow               saliency      superres              videoio          xphoto.hpp
bioinspired.hpp  dnn.hpp         fuzzy.hpp     imgproc.hpp   
...

{edit 2} 通过添加以下内容在 mexopencv Makefile 中取消链接 -lopencv_dnn:

CV_LDFLAGS := $(filter-out -lopencv_dnn,$(CV_LDFLAGS))

不是一个选项,因为对 cv::dnn::experimental_dnn_v3 的 undefined reference 仍然编译失败。所以我想我需要解决这个问题。

最佳答案

找到了我的问题的解决方案。原因是盲目跟风mexopencv对于 Opencv 安装部分。我必须在 cmake 步骤中使用以下内容:

# build and compile opencv-3.4.0:
$ cmake -G "Unix Makefiles" \
    -DBUILD_DOCS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_JAVA=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_CUBLAS:BOOL=OFF \
    -DWITH_CUFFT:BOOL=OFF \
    -DWITH_NVCUVID:BOOL=OFF \
    -DBUILD_opencv_cudaarithm:BOOL=OFF \
    -DBUILD_opencv_cudabgsegm:BOOL=OFF \
    -DBUILD_opencv_cudacodec:BOOL=OFF \
    -DBUILD_opencv_cudafeatures2d:BOOL=OFF \
    -DBUILD_opencv_cudafilters:BOOL=OFF \
    -DBUILD_opencv_cudaimgproc:BOOL=OFF \
    -DBUILD_opencv_cudalegacy:BOOL=OFF \
    -DBUILD_opencv_cudaobjdetect:BOOL=OFF \
    -DBUILD_opencv_cudaoptflow:BOOL=OFF \
    -DBUILD_opencv_cudastereo:BOOL=OFF \
    -DBUILD_opencv_cudawarping:BOOL=OFF \
    -DBUILD_opencv_cudev:BOOL=OFF \
    -DBUILD_opencv_java=OFF \
    -DBUILD_opencv_js=OFF \
    -DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=OFF \
    -DBUILD_opencv_ts=OFF \
    -DBUILD_opencv_world=OFF \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DOPENCV_ENABLE_NONFREE=ON \
    -DOPENCV_EXTRA_MODULES_PATH=~/cv/opencv_contrib-3.4.0/modules ~/cv/opencv-3.4.0
$ make -j8  # -j$(nproc)
$ sudo make install

# compile mexopencv = OK
$ make MATLABDIR=/usr/local/MATLAB/R2018a WITH_CONTRIB=true all contrib

与 wiki 的主要区别在于从 cmake 步骤中删除了以下两行:

-DWITH_MATLAB=OFF \
-DBUILD_opencv_matlab=OFF \

关于matlab - |Ubuntu 18.04, opencv-3.4.0, MATLAB/R2018a| make 因对 cv::dnn::eperimental 的 undefined reference 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52181085/

相关文章:

asp.net - 构建时在 Visual Studio 2008 Express 中没有编译 DLL

java - 如何用gradle复制多个jar?

matlab - 精确对齐两个WAV文件

arrays - 如何在 Matlab 中将 NaN 分配给值 j < k

python - OpenCV 无法在 Linux 上从超过 8 个网络摄像头进行捕获

python-3.x - 调整图像及其边界框的大小

matlab - 如何通过移动特定间隔有效地将一个列矩阵 reshape 为许多特定长度的列

matlab - MATLAB中的离散小波变换

Android Studio 和 OpenCV 'Compilation Error' , 'Cannot resolve symbol styleable'

javascript - 如何检查 *chunk.js 中的不同源大小