[ASP.Net 6] Docker Container 빌드시 OpenCVSharp DllNotFoundException오류 해결 방법

 

 OpenCVSharp를 사용해서 Image Processing을 하는 WebAPI 어플리케이션을 작성하고 Docker Container를 빌드 한 다음 해당 API를 호출 해보면 OpeCVSharp 함수 호출 시 DllNotFoundException 오류가 발생합니다.

 해당 컨테이너에 Linux 커널에 맞는 OpenCVSharp 라이브러리 바이너리가 없어서 발생하는 문제인데 OpenCVSharp 코드를 내려받아 라이브러리를 컴파일후 /usr/lib/ 디렉토리에 복사하도록 아래 내용을 Dockerfile에 추가 해야 합니다.

 

ENV OPENCV_VERSION=4.8.0

# Install opencv dependencies
RUN apt-get update && apt-get -y install --no-install-recommends \
      apt-transport-https \
      software-properties-common \
      wget \
      unzip \
      ca-certificates \
      build-essential \
      cmake \
      git \
      libtbb-dev \
      libatlas-base-dev \
      libgtk2.0-dev \
      libavcodec-dev \
      libavformat-dev \
      libswscale-dev \
      libdc1394-dev \
      libxine2-dev \
      libv4l-dev \
      libtheora-dev \
      libvorbis-dev \
      libxvidcore-dev \
      libopencore-amrnb-dev \
      libopencore-amrwb-dev \
      x264 \
      libtesseract-dev \
      libgdiplus \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

# Setup opencv and opencv-contrib source
RUN wget -q https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
    unzip -q ${OPENCV_VERSION}.zip && \
    rm ${OPENCV_VERSION}.zip && \
    mv opencv-${OPENCV_VERSION} opencv && \
    wget -q https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
    unzip -q ${OPENCV_VERSION}.zip && \
    rm ${OPENCV_VERSION}.zip && \
    mv opencv_contrib-${OPENCV_VERSION} opencv_contrib

# Build OpenCV
RUN cd opencv && mkdir build && cd build && \
    cmake \
    -D OPENCV_EXTRA_MODULES_PATH=/opencv_contrib/modules \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D BUILD_SHARED_LIBS=OFF \
    -D ENABLE_CXX11=ON \
    -D BUILD_EXAMPLES=OFF \
    -D BUILD_DOCS=OFF \
    -D BUILD_PERF_TESTS=OFF \
    -D BUILD_TESTS=OFF \
    -D BUILD_JAVA=OFF \
    -D BUILD_opencv_app=OFF \
    -D BUILD_opencv_barcode=OFF \
    -D BUILD_opencv_java_bindings_generator=OFF \
    -D BUILD_opencv_js_bindings_generator=OFF \
    -D BUILD_opencv_python_bindings_generator=OFF \
    -D BUILD_opencv_python_tests=OFF \
    -D BUILD_opencv_ts=OFF \
    -D BUILD_opencv_js=OFF \
    -D BUILD_opencv_bioinspired=OFF \
    -D BUILD_opencv_ccalib=OFF \
    -D BUILD_opencv_datasets=OFF \
    -D BUILD_opencv_dnn_objdetect=OFF \
    -D BUILD_opencv_dpm=OFF \
    -D BUILD_opencv_fuzzy=OFF \
    -D BUILD_opencv_gapi=OFF \
    -D BUILD_opencv_intensity_transform=OFF \
    -D BUILD_opencv_mcc=OFF \
    -D BUILD_opencv_objc_bindings_generator=OFF \
    -D BUILD_opencv_rapid=OFF \
    -D BUILD_opencv_reg=OFF \
    -D BUILD_opencv_stereo=OFF \
    -D BUILD_opencv_structured_light=OFF \
    -D BUILD_opencv_surface_matching=OFF \
    -D BUILD_opencv_videostab=OFF \
    -D BUILD_opencv_wechat_qrcode=ON \
    -D WITH_GSTREAMER=OFF \
    -D WITH_ADE=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    .. && make -j$(nproc) && make install && ldconfig

# Download OpenCvSharp
RUN git clone https://github.com/shimat/opencvsharp.git && cd opencvsharp

# Install the Extern lib.
RUN mkdir /opencvsharp/make && cd /opencvsharp/make && \
    cmake -D CMAKE_INSTALL_PREFIX=/opencvsharp/make /opencvsharp/src && \
    make -j$(nproc) && make install && \
    rm -rf /opencv && \
    rm -rf /opencv_contrib && \
    cp /opencvsharp/make/OpenCvSharpExtern/libOpenCvSharpExtern.so /usr/lib/

 

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

[삽입]

WORKDIR /app

...

 

위의 커맨드들을 추가한 다음 docker container을 빌드해서 실행하면 OpenCVSharp 함수들이 정상 동작 합니다.

 

출처: https://github.com/khuyen94/OpenCVSharp-dotnet6-docker/blob/main/OpenCVSharp-dotnet6-docker/Dockerfile

 

 Dockerfile 수정 없이 해결하는 방법으로는 OpenCVSharp 대신 ImageSharp이나 SkiaSharp을 사용하는 방법이 있습니다.

ImageSharp의 경우 v3.x 부터 유료화 되어서 상업적 목적의 어플의 경우 v2.x (Apache 2.0 license)을 사용 하셔야 합니다.

SkiaSharp은 24bit 이미지 처리를 못하는 문제가 있어서 pixel data 조작해야 하는 경우 어려움이 있을 수 있습니다. 그리고 ImageSharp은 WPF 앱 개발시 View에 출력하기 위해 BitmapSource로 변환 해야하는데 이 때 성능(속도) 문제가 있을 수 있습니다.