在Ubuntu16.04上编译opencv4.1.0-gpu带contrib版本碰到的问题

1.未定义的引用

具体的错误如下(没有截图):

对‘__cxa_init_primary_exception@CXXABI_1.3.11’未定义的引用

对‘std::__exception_ptr::exception_ptr::exception_ptr(void*)@CXXABI_1.3.11’未定义的引用

这个问题主要是在cmake时参数选择了如下这个,从查阅的资料来看,它指的是高性能并行的Intel tbb。起初我在AMD的CPU上带该参数进行编译,出现如上所示的错误。以为只能是Intel的CPU能用。随后我在i7-9700F上带该参数进行编译,还是出现该错误。不管是AMD还是Intel的CPU只要不带该参数,就不会出现上述错误。目前还不知道导致该问题的深层原因。

-D WITH_TBB=ON

2.没有那个文件或目录

具体出现错误的提示如下:

fatal error: boostdesc_bgm.i: 没有那个文件或目录

以这个为搜索,可以发现这个问题好多人都出现过。网络问题,主要是以下几个文件没有下载到:

  1. boostdesc_bgm.i
  2. boostdesc_bgm_bi.i
  3. boostdesc_bgm_hd.i
  4. boostdesc_lbgm.i
  5. boostdesc_binboost_064.i
  6. boostdesc_binboost_128.i
  7. boostdesc_binboost_256.i
  8. vgg_generated_120.i
  9. vgg_generated_64.i
  10. vgg_generated_80.i
  11. vgg_generated_48.i

下载地址在自己建的编译文件内。比如我建立的编译文件夹是build,所以路径是:build/CMakeDownloadLog.txt。在这个文件中就包含下载地址。可能需要vpn呀。这里有人上传到百度云上了,我弄好了才发现[哭]。将下载的文件放到opencv_contrib/modules/xfeatures2d/src/ 路径下重新make。

我自己下载的文件,我使用的opencv4.1.0版本(不确定不同版本是否相同)。

百度云;提取码:w1z2。

3.缺少依赖库

这个错误具体如下:

fatal error: GL/gl.h: 没有那个文件或目录

如果你按照这篇博客编译,就不会碰到这个问题。主要是缺少OpenGL依赖库。安装命令如下:

sudo apt-get install mesa-common-dev
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

4.编译时头文件不对

4.1 第一个

具体错误如下:

fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录

头文件include地址不对,解决方法如下:

将opencv-4.1.0/modules/features2d/test/文件下的

test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_invariance_utils.hpp

拷贝到opencv_contrib-4.1.0/modules/xfeatures2d/test/文件下。

同时,将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_features2d.cpp文件下的

#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"

改成:

#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"

将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp文件下的

#include "features2d/test/test_detectors_invariance.impl.hpp" 
#include "features2d/test/test_descriptors_invariance.impl.hpp"

改成:

#include "test_detectors_invariance.impl.hpp"
#include "test_descriptors_invariance.impl.hpp"

4.2 第二个

具体错误如下:

fatal error: opencv2/xfeatures2d/cuda.hpp: 没有那个文件或目录

这个问题跟4.1好像,所以开始我也和上面的操作一样,虽然没有报同样的错误,但是出现了很多的未定义引用的错误。所以就这个方法失效了。在我仔细查看具体错误时发现这个错误出现在make的99%处(差一点点就成功了);同时,编译的文件是XXX_example文件中,所以我从头cmake,不选如下这个参数。

-D BUILD_EXAMPLES=ON

 5.缺省qt库文件

这个问题其实不是编译、安装opencv时出现的问题。而是编译如下代码时出现的问题。

CMakeLists.txt

# cmake needs this line
cmake_minimum_required(VERSION 2.8)
 
# Define project name
project(test)
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV 4.1.0 REQUIRED)

set(CMAKE_CXX_STANDARD 14)
 
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
 
if(CMAKE_VERSION VERSION_LESS "2.8.11")
  # Add OpenCV headers location to your include paths
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()
 
# Declare the executable target built from your sources
add_executable(opencv_example main.cpp)
 
# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS})

 main.cpp

using namespace std;
#include "opencv2/opencv.hpp"
#include "opencv2/core/cuda.hpp"
using namespace cv;
using namespace cv::cuda;
 
int main()
{
    int num_devices = cv::cuda::getCudaEnabledDeviceCount();
 
    if(num_devices <= 0)
    {
        std::cerr<<"There is no device."<<std::endl;
        return -1;
    }
    int enable_device_id = -1;
    for(int i=0;i<num_devices;i++)
    {
        cv::cuda::DeviceInfo dev_info(i);
        if(dev_info.isCompatible())
        {
            enable_device_id=i;
        }
    }
    if(enable_device_id < 0)
    {
        std::cerr<<"GPU module isn't built for GPU"<<std::endl;
        return -1;
    }
    cv::cuda::setDevice(enable_device_id);
 
    std::cout<<"GPU is ready, device ID is "<<num_devices<<"\n";
 
    VideoCapture cap(0);
    Mat frame;
    Mat dst_image;
    while(1)
    {
        cap>>frame;
        cuda::GpuMat d_src_img(frame);
        cuda::GpuMat d_dst_img;
        cuda::cvtColor(d_src_img,d_dst_img,COLOR_BGR2GRAY);
        d_dst_img.download(dst_image);
        imshow("test",dst_image);
        if (waitKey(1) > 0) break;
    }
    return 0;
}

具体错误如下(这个方法有问题,会导致电脑重启后登入不了桌面。后面研究再更新。具体分析看下面):

开头是警告:/usr/bin/ld: warning: libpng16.so.16, needed by //home/seventhblue/anaconda3/lib/libQt5Gui.so.5, not found (try using -rpath or -rpath-link)

中间是://home/seventhblue/anaconda3/lib/libQt5Core.so.5:对‘ucal_getDefaultTimeZone_58’未定义的引用(有很多这样的)

结尾是:Makefile:83: recipe for target 'all' failed

我尝试的解决方法是在终端搜寻一下该文件的具体位置,输入(再次提醒下列操作有风险):

find /home -name "libpng16.so.16" 

一般会显示/hom/username/anaconda3/lib/libicui18n.so.58(其实我仔细看了一下,上面的地址中有两个反斜杠,所以找不到该文件)。然后终端输入:

sudo gedit /etc/profile

将显示的地址输入到打开文件的最后一行。比我的用户名是weiz,则输入如下内容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/weiz/anaconda3/lib

最后刷新一下:

source /etc/profile

如果还是头铁,硬要尝试一下。我只能说牛逼。改完后,不出意外编译代码能成功。但是下次重新启动电脑时,会出现登入了桌面但是没有桌面的图标和Unity。这个时候,慌了[doge]。我在AMD的CPU平台上只需要按住Ctrl+Alt+f1,输入root账号和密码,再输入vi /etc/profile(如果vi命令都没有用了,可以百度一下),注释掉添加的那个环境变量(可以再source /etc/profile)最后reboot。但是我在Intel的CPU平台上采用同样的方法,可以进入桌面,并且有图标也能用其他软件,但是输入nvidia-smi时,显示显卡驱动链接不上。找了很多方法都是没有效果,最后没办法了,重装原来安装的显卡驱动程序。安装显卡驱动后其他软件,比如anaconda和cuda等目前没有问题。

后续---------------------------------------------------------

找到了一个比较靠谱的方法,具体错误如下:

从上面的路径去看,能找到相应的文件,但是电脑就是找不到,估计就是“//home/...”前面双斜杠的问题。解决方法是“sudo ln -s 源文件 目标文件”命令。该命令的作用是为某一个文件或目录在另外一个位置建立一个同步的链接,类似Windows下的超级链接。看起来就比较靠谱[doge]。具体步骤如下:

cd /usr/lib/x86_64-linux-gnu
sudo ln -s ~/anaconda3/lib/libpng16.so.16 libpng16.so.16
sudo ln -s ~/anaconda3/lib/libicui18n.so.58 libicui18n.so.58
sudo ln -s ~/anaconda3/lib/libicuuc.so.58 libicuuc.so.58
sudo ln -s ~/anaconda3/lib/libicudata.so.58 libicudata.so.58
sudo ldconfig

找到其他解释这种错误的原因:anaconda3和minicomda3的出现给用户带来了很多方便,但是却因为在系统中存在同一软件的多个版本,而且在编译源码的时候,系统会默认先查找anaconda3或者miniconda3下的lib库并进行链接,所以如果查找到的库和真正需要链接的库不是同一个版本的话,就很容易出现类似上面这样的问题。

解决完上面的问题又出现如下错误:

//usr/lib/x86_64-linux-gnu/libpng16.so.16:对‘inflateValidate@ZLIB_1.2.9’未定义的引用

是zlib的版本问题,因为这里指出是ZLIB1.2.9,所以我一查,我安装的是zlib1.2.8。解决步骤如下:

wget http://www.zlib.net/fossils/zlib-1.2.9.tar.gz  // 或者手动去 http://www.zlib.net/fossils/ 官网下载
tar -xvf zlib-1.2.9.tar.gz
cd zlib-1.2.9
mkdir build
cd build
cmake ..
make
sudo make install

至此,Ubuntu16.04系统下完整编译opencv4.1.0(带contrib和cuda)版本完成。后续可能会有怎么使用opencv-gpu的学习记录。不过,博客不一定会在这篇博客之后,也有可能在这篇博客之前。毕竟我会补充原来博客的内容的和修改原来博客的错误。

  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值