繁体   English   中英

在 linux 上运行 Emgu.CV

[英]Running Emgu.CV on linux

我试图在 linux 上使用Emgu ,但收到错误消息:

未处理的异常。 System.TypeInitializationException:
'Emgu.CV.CvInvoke' 的类型初始值设定项抛出异常。
---> System.DllNotFoundException: 无法加载共享库“cvextern”或其依赖项之一

在查看SO文档后,我明白我需要:

确保非托管 DLL 位于执行目录中。

但是 - 我如何得到它们?
如果我在 Windows 机器上运行同一个项目(+ 取消注释对Emgu.CV.runtime.windows包的引用),我确实在我的 bin 文件夹中得到了x86x64文件夹,我可以从中获取二进制文件,但显然什么时候使用Emgu.CV.runtime.ubuntu包,不会创建这些文件夹。


最小的、可重现的示例:
程序.cs:

using Emgu.CV;
using Emgu.CV.Structure;
using System;

namespace temp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Works on windows, fails on linux
            var imageFromBytes = new Image<Rgb, byte>(2, 2);


            //// Later on I would like this to work as well...
            // var bytes = new byte[] { 1, 2, 3, 4 };
            // CvInvoke.Imdecode(bytes, Emgu.CV.CvEnum.ImreadModes.Color, imageFromBytes.Mat);
        }

    }
}

项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Emgu.CV.runtime.ubuntu" Version="4.4.0.4061" />

    <!-- When running on windows & uncommenting this line - I get can get the binaries-->
    <!-- <PackageReference Include="Emgu.CV.runtime.windows" Version="4.4.0.4061" /> -->

  </ItemGroup>

</Project>


附加信息:
dotnet 版本:3.1.301
Emgu版本:4.4.0.4061

所以,经过几天的挣扎 - 回答我自己的问题。

据我了解,这里有两个问题:

  1. libcvextern.so丢失。
  2. 缺少libcvextern.so依赖项。

修复问题:

1. 缺少 libcvextern.so

  1. 下载了Emgu.CV.runtime.ubuntu
  2. 解压缩它并获取libcvextern.so文件( build/x64/libcvextern.so )。
  3. libcvextern.so文件添加到项目中,并将Copy to Output directory设置为Copy if Newer

注意:对于 windows nuget 包,您需要的文件会自动添加。 不知道为什么这不会发生在 linux 上。

2. 缺少依赖:

  1. 根据文档(Linux -> 准备就绪),我已经克隆了 repo 并运行了确保所有依赖项都已安装的脚本:

获取 dotnet 框架:

wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb

获取源代码:

git clone https://github.com/emgucv/emgucv emgucv 
cd emgucv
git submodule update --init --recursive

确保依赖项可用:

# cd into the relevant platform
cd platforms/ubuntu/20.04

# As per documentation: This only needs to be run once.
./apt_install_dependency

# This is what actually builds the dependencies. This will take a while...
./cmake_configure


奖金:
如果你和我一样,对你的机器没有 root 权限,你可以使用 docker。
我使用的 Dockerfile:

FROM ubuntu
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8


# Bring the dotnet Framework
RUN wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN apt-get update; \
  apt-get install -y apt-transport-https && \
  apt-get update && \
  apt-get install -y dotnet-sdk-3.1


# Make sure all emgu dependencies are in place
# http://www.emgu.com/wiki/index.php/Download_And_Installation#Getting_ready
WORKDIR /mnt/emgu_repo
RUN git clone https://github.com/emgucv/emgucv emgucv
WORKDIR /mnt/emgu_repo/emgucv
RUN git submodule update --init --recursive
WORKDIR /mnt/emgu_repo/emgucv/platforms/ubuntu/18.04
RUN apt-get update && apt-get -y install sudo
RUN `cat ./apt_install_dependency.sh | grep -Ev "\#\!"` -y
RUN ./cmake_configure.sh


ENTRYPOINT ["bash"]

分享我的答案

Avi Turner 的回答ldd libcvextern.so这个命令ldd libcvextern.so

并检查是否缺少任何依赖项。(例如, 尝试让 Emgu.CV 在 debian 上的 dotnet core 3.1 中运行

安装缺少的依赖apt-get update&&apt-get install libgdiplus libx11-dev libgeotiff-dev libxt-dev libopengl-dev libglx-dev libusb-1.0-0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM