问题描述:
运行编译通过,运行时报错:
报错matrix.cpp
OpenCV Error: Assertion failed (s >= 0) in setSize, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/matrix.cpp, line 307
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/matrix.cpp:307: error: (-215) s >= 0 in function setSize
相关的可执行文件的链接库如下:
libopencv_core.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2 (0x00007f140cbd7000)
libopencv_line_descriptor.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_line_descriptor.so.3.4 (0x00007f140a2f1000)
libopencv_calib3d.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_calib3d.so.3.4 (0x00007f1408ab0000)
libopencv_features2d.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_features2d.so.3.4 (0x00007f14087e1000)
libopencv_highgui.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_highgui.so.3.4 (0x00007f140859f000)
libopencv_imgproc.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_imgproc.so.3.4 (0x00007f14055a2000)
libopencv_core.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_core.so.3.4 (0x00007f1404233000)
libopencv_imgcodecs.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2 (0x00007f1403dcb000)
libopencv_imgproc.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2 (0x00007f1403572000)
libopencv_flann.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_flann.so.3.4 (0x00007f13fd041000)
libopencv_imgcodecs.so.3.4 => /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_imgcodecs.so.3.4 (0x00007f13fc2b6000)
可以看到,这里我所调用的OpenCV是自己安装的OpenCV3.4.6位于第三方的位置。相关的编译命令如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/home/nan/LIBS/opencv-3.4.6/release/installed \-D INSTALL_C_EXAMPLES=ON \-D INSTALL_PYTHON_EXAMPLES=ON \-D WITH_TBB=ON \-D WITH_V4L=ON \-D WITH_QT=ON \-D WITH_OPENGL=ON \-D WITH_CUDA=ON \-D OPENCV_EXTRA_MODULES_PATH=/home/nan/LIBS/opencv-3.4.6/opencv_contrib/modules ..
同时编译了opencv对应的contrib,prefix为自定义的第三方路径。然后也是创建了
/etc/ld.so.conf.d/libopencv.conf
来避免OpenCV的冲突,并且在自己的程序中set了OPENCV_DIR
然后编译自己的程序时,到最后会有几个warning:
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../lib/xxx.so, may conflict with libopencv_core.so.3.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.3.4, needed by /home/nan/LIBS/opencv-3.4.6/release/installed/lib/libopencv_highgui.so.3.4.6, may conflict with libopencv_imgcodecs.so.3.2
这里由于是warning就没有大问题,可以通过编译,但是运行时会出现上述的错误。
解决办法:
1. 尝试消除warning后,错误仍然出现。warning是由于这些库默认找的opencv和我安装的不是同一个,所以需要手动改CMakeLists来编译。
2.修改完成后就没问题了。。。。
参考:
https://stackoverflow.com/questions/56282718/why-cv-bridge-uses-opencv-3-2-in-ros-melodic
解决cv_bridge等找opencv库不太对的问题:
https://blog.csdn.net/wakingking88/article/details/104648636
https://blog.csdn.net/bigdog_1027/article/details/79092263
https://blog.csdn.net/qq_38589460/article/details/88756701
https://blog.csdn.net/xiat5/article/details/79354573