Avi*_*ner 2 c# emgucv .net-core
我尝试在 Linux 上使用Emgu,但收到错误消息:
未处理的异常。System.TypeInitializationException:
“Emgu.CV.CvInvoke”的类型初始值设定项引发异常。
---> System.DllNotFoundException:无法加载共享库“cvextern”或其依赖项之一
确保非托管 DLL 位于执行目录中。
但是 - 我如何获得它们?
如果我在 Windows 计算机上运行相同的项目(+取消注释对Emgu.CV.runtime.windows包的引用),我确实会在 bin 文件夹中获取x86&x64文件夹,我可以从中获取二进制文件,但显然在使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
项目文件:
<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>
Run Code Online (Sandbox Code Playgroud)
附加信息:
dotnet 版本:3.1.301
Emgu 版本:4.4.0.4061
Avi*_*ner 11
因此,经过几天的挣扎 - 回答我自己的问题。
据我了解,这里有两个问题:
libcvextern.so失踪。libcvextern.so缺少依赖项。1.缺少libcvextern.so:
libcvextern.so文件( build/x64/libcvextern.so)。libcvextern.so到项目中并设置Copy to Output directory为Copy if Newer注意:对于 Windows nuget 包,您需要的文件会自动添加。不知道为什么 Linux 上不会发生这种情况。
2.缺少依赖项:
获取 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
Run Code Online (Sandbox Code Playgroud)
获取源代码:
git clone https://github.com/emgucv/emgucv emgucv
cd emgucv
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)
确保依赖项可用:
# 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
Run Code Online (Sandbox Code Playgroud)
额外奖励:
如果您像我一样没有机器的 root 权限,则可以使用 docker。
更新 SEP-2023:
我将尝试并继续发布新版本的 docker 文件,因为它们在使 emgu 工作后得出我的结论......
我使用过的 Dockerfile:
.NET 7,emgu 4.6,2022年 12 月:
FROM ubuntu:20.04
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8
RUN apt-get update && apt-get -y install sudo
# Dotnet Framework
# https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu
WORKDIR /tmp
RUN wget https://packages.microsoft.com/config/ubuntu/20.10/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-7.0
# 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 fetch origin 4.6.0
RUN git checkout 4.6.0
RUN git submodule update --init --recursive
# install cmake for compiling open cv dependencies
RUN apt-get update && apt-get install -y cmake protobuf-compiler ffmpeg libgtk-3-dev libgstreamer1.0-dev libavcodec-dev libswscale-dev libavformat-dev libv4l-dev ocl-icd-dev freeglut3-dev libgeotiff-dev libusb-1.0-0-dev libdc1394-dev
WORKDIR /mnt/emgu_repo/emgucv/platforms/ubuntu/20.04
RUN ./apt_install_dependency
# this takes a long time
RUN ./cmake_configure
WORKDIR /mnt/my_app_root
# emgu needs the libcvextern.so file & dependency in the rrot folder
RUN cp /mnt/emgu_repo/emgucv/libs/runtimes/ubuntu-x64/native/* ./
ENTRYPOINT ["bash"]
Run Code Online (Sandbox Code Playgroud)
.NET core 3.1,emgu 4.3,2020年 9 月:
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"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4044 次 |
| 最近记录: |