【问题标题】:How to install OpenCV on arch linux如何在 Arch linux 上安装 OpenCV
【发布时间】:2017-12-23 19:46:52
【问题描述】:

我尝试使用 aur 包在 arch 上安装 opencv。它已成功安装,但是当我尝试在 python 中导入 opencv2 时,出现以下错误

ImportError: libhdf5.so.100: cannot open shared object file: No such file or directory

不仅仅是 python ,即使我尝试使用它运行 c++ 示例代码,我也遇到了同样的错误。我已经尝试在网上搜索,找到了一些遇到类似问题的人,但我仍然无法解决它。

我已安装 Open CV 3.2 版

【问题讨论】:

标签: python opencv installation archlinux opencv4


【解决方案1】:

有多个名称相似的软件包,但只有一个有效。

如果你还没有安装 OpenCV,运行:

pacman -S opencv
pacman -S python-opencv

安装hdf5:

pacman -S hdf5

请注意,依赖于 OpenCV 的 Sikuli 的 instructions 表示 /usr/lib 中需要符号链接。系统升级可能会破坏链接,必须重新创建链接以指向最新版本的 OpenCV Java 库:

# ls -la /usr/lib/libopencv_java*
-rwxr-xr-x 1 root root 2225952 Jul 18 02:48 /usr/lib/libopencv_java440.so
lrwxrwxrwx 1 root root      20 Aug  5 22:42 /usr/lib/libopencv_java.so -> libopencv_java440.so

这可以使用ln 命令来完成:

sudo su -
cd /usr/lib
rm libopencv_java.so
ln -s libopencv_java440.so libopencv_java.so

【讨论】:

  • 其实编译c++不需要base-devel和opencv-samples。
  • 请注意,由于recent splitting of the packages,还需要安装python-opencv。此外,-Syu 是不必要的。 -S 就足够了。关于“有多个名称相似但只有一个有效的包。”,我只在官方 repos 中看到opencv,尽管(像往常一样)AUR 中有很多变体,包括opencv-cuda。跨度>
【解决方案2】:

在版本 4 中,在默认配置下,编译 opencv 需要hdf5vtk,但是它没有被列为依赖项 opencv.

archlinux 页面的两个 bug 中提到了这一点:12

有两种可能的解决方法:

  1. sudo pacman -S hdf5 vtk(大约占用 231.24 MiB 的内存)
  2. 如果您的程序不需要hdf5vtk,请从/usr/lib/pkgconfig/opencv4.pc 中删除-lopencv_hdf-lopencv_viz(如果程序使用pkg-config),或者在编译时删除这2 个标志。

警告:如果您使用解决方法 2,opencv 软件包的更新将恢复这些更改。您可能希望将它们添加为 pacman.conf 中的 NoUpgrade 条目(有关详细信息,请阅读手册页),但该文件将不再更新并且其他内容可能会中断。

【讨论】:

    【解决方案3】:

    对于opencv4

    sudo pacman -Sy opencv vtk hdf5
    

    可选地,安装 Qt

    sudo pacman -Sy qt5-base qtcreator qt5-doc gdb cmake
    

    在 QtCreator 中创建一个 CMake 项目

    粘贴以下内容

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.5)
    
    project(opencv LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    add_executable(opencv main.cpp)
    
    find_package( OpenCV REQUIRED )
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    target_link_libraries( opencv ${OpenCV_LIBS} )
    

    ma​​in.cpp

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv)
    {
        if ( argc != 2 )
        {
            printf("usage: DisplayImage.out <Image_Path>\n");
            return -1;
        }
        Mat image;
        image = imread( argv[1], 1 );
        if ( !image.data )
        {
            printf("No image data \n");
            return -1;
        }
        namedWindow("Display Image", WINDOW_AUTOSIZE );
        imshow("Display Image", image);
        waitKey(0);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2015-02-17
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2012-03-17
      • 2020-01-13
      相关资源
      最近更新 更多