如何在Arch Linux上安装OpenCV

7
我曾尝试使用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。


我也尝试在这里安装libhd5包 https://aur.archlinux.org/packages/libhdf5/ - Reuben_v1
你到底安装了哪个OpenCV包? opencv不是一个AUR包,它提供的是3版本。 - E net4
这是 https://www.archlinux.org/packages/extra/x86_64/opencv/ - Reuben_v1
3个回答

11

有多个名字相似的包,但只有一个是有效的。

如果您尚未安装OpenCV,请运行:

pacman -S opencv
pacman -S python-opencv

安装hdf5

pacman -S hdf5

请注意,Sikuli依赖于OpenCV,因此说明书指出在/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。 - user202729
请注意,由于最近拆分软件包,还需要安装python-opencv。此外,-Syu是不必要的,只需使用-S即可。关于“有多个名称相似但只有一个有效的软件包”的问题,我只在官方仓库中看到了opencv,尽管在AUR中有许多变体,包括opencv-cuda - Mateen Ulhaq

6
在默认配置下,版本4编译opencv需要hdf5vtk,但它没有列为opencv的依赖项。这在archlinux页面上的两个错误中提到:12。有两种可能的解决方法:
  1. sudo pacman -S hdf5 vtk(大约需要231.24 MiB内存)
  2. 如果您的程序不需要hdf5vtk,则从/usr/lib/pkgconfig/opencv4.pc中删除-lopencv_hdf-lopencv_viz(如果程序使用pkg-config),或者在编译时删除这两个标志。
警告:如果您使用解决方法2,则opencv包的更新将恢复这些更改。您可能希望将它们添加为pacman.conf中的NoUpgrade条目(详见man页面),但该文件将不再更新,可能会出现其他问题。

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} )

main.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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接