运行 Emgu.CV 在 linux
Running Emgu.CV on linux
我正尝试在 linux 上使用 Emgu,但收到错误消息:
Unhandled exception. System.TypeInitializationException:
The type initializer for 'Emgu.CV.CvInvoke' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'cvextern' or one of its dependencies
在 SO and the documentation 环顾四周后,我明白我需要:
Make sure the unmanaged DLLs are in the execution directory.
但是 - 我如何获得它们?
如果我在 windows 机器上 运行 同一个项目(+ 取消对 Emgu.CV.runtime.windows
包的引用的注释),我确实得到了 x86
& x64
文件夹我的 bin 文件夹,我可以从中获取二进制文件,但显然在使用 Emgu.CV.runtime.ubuntu
包时,不会创建这些文件夹。
最小的、可重现的示例:
Program.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>
附加信息:
网络版本:3.1.301
Emgu 版本:4.4.0.4061
所以,经过几天的努力 - 回答我自己的问题。
据我了解,这里有两个问题:
libcvextern.so
丢失。
libcvextern.so
依赖项丢失。
解决问题:
1.缺少 libcvextern.so:
- 已下载 Emgu.CV.runtime.ubuntu
- 解压缩并获得
libcvextern.so
文件 (build/x64/libcvextern.so
)。
- 将
libcvextern.so
文件添加到项目中并将Copy to Output directory
设置为Copy if Newer
注意: 对于 windows nuget 包,您需要的文件会自动添加。不确定为什么 linux.
不会发生这种情况
2。缺少依赖项:
- 根据 documentation(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
安装缺少的依赖项
apt-get update&&apt-get install libgdiplus libx11-dev libgeotiff-dev libxt-dev libopengl-dev libglx-dev libusb-1.0-0
我正尝试在 linux 上使用 Emgu,但收到错误消息:
Unhandled exception. System.TypeInitializationException:
The type initializer for 'Emgu.CV.CvInvoke' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'cvextern' or one of its dependencies
在 SO and the documentation 环顾四周后,我明白我需要:
Make sure the unmanaged DLLs are in the execution directory.
但是 - 我如何获得它们?
如果我在 windows 机器上 运行 同一个项目(+ 取消对 Emgu.CV.runtime.windows
包的引用的注释),我确实得到了 x86
& x64
文件夹我的 bin 文件夹,我可以从中获取二进制文件,但显然在使用 Emgu.CV.runtime.ubuntu
包时,不会创建这些文件夹。
最小的、可重现的示例:
Program.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>
附加信息:
网络版本:3.1.301
Emgu 版本:4.4.0.4061
所以,经过几天的努力 - 回答我自己的问题。
据我了解,这里有两个问题:
libcvextern.so
丢失。libcvextern.so
依赖项丢失。
解决问题:
1.缺少 libcvextern.so:
- 已下载 Emgu.CV.runtime.ubuntu
- 解压缩并获得
libcvextern.so
文件 (build/x64/libcvextern.so
)。 - 将
libcvextern.so
文件添加到项目中并将Copy to Output directory
设置为Copy if Newer
注意: 对于 windows nuget 包,您需要的文件会自动添加。不确定为什么 linux.
不会发生这种情况2。缺少依赖项:
- 根据 documentation(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
安装缺少的依赖项
apt-get update&&apt-get install libgdiplus libx11-dev libgeotiff-dev libxt-dev libopengl-dev libglx-dev libusb-1.0-0