コンパイルしてUbuntuにOpenCV3をインストールします

 

目次

バックグラウンド

依存関係をインストールする

ffmpegをインストールします

opencv3をコンパイルしてインストールします

理想的な状況

エラー処理

ヘッダーファイルをコピーする

ヘッダーファイルを変更します

OpenCVファイルを変更する

ファイルメソッドの変更

より良い解決策-OpenCVバージョンを変更する

3.4.1バージョンのOpenCVおよびOpenCV_contrib

xfeatures2dソースファイルをダウンロードする

OpenCVファイルを変更する

コンパイルしてインストールする

構成

テスト

結論


バックグラウンド

少し前にUbuntu18.0464ビットにOpenCV3をインストールするプロセスを記録します。運が良ければ、参考のために非常に面倒です。

依存関係をインストールする

root@sundata:/etc/apt/sources.list.d# apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libx264-dev libx265-dev
root@sundata:/etc/apt/sources.list.d# apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev ffmpeg libavformat-dev libavcodec-dev libswresample-dev libswscale-dev libavutil-dev libsdl1.2-dev yasm

ffmpegをインストールします

root@sundata:/data/szc# git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
root@sundata:/data/szc# cd ffmpeg/
root@sundata:/data/szc/ffmpeg# ./configure   --enable-shared  --prefix=/usr/local/ffmpeg  --enable-gpl --enable-libx264  --enable-libx265
root@sundata:/data/szc/ffmpeg# make && make install

コンパイル中にエラーが報告された場合:V4L2_PIX_FMT_JPEGがここで宣言されていない場合は、libavdevice / v4l2-common.hファイルを変更し、#include <linux /videodev2.h>周辺のマクロ判定をコメントアウトします。

// #if HAVE_SYS_VIDEOIO_H
// #include <sys/videoio.h>
// #else
// #if HAVE_ASM_TYPES_H
// #include <asm/types.h>
// #endif
#include <linux/videodev2.h>
// #endif

テストをする

root@sundata:/data/szc/ffmpeg# ldd ffmpeg
    linux-vdso.so.1 (0x00007ffd3fbb1000)
    libavdevice.so.58 => not found
    libavfilter.so.7 => not found
    libavformat.so.58 => not found
    libavcodec.so.58 => not found
    libpostproc.so.55 => not found
    libswresample.so.3 => not found
    libswscale.so.5 => not found
    libavutil.so.56 => not found
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7bf1a84000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7bf1865000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7bf1474000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7bf2068000)

root@sundata:/data/szc/ffmpeg# ffmpeg -version
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

opencv3をコンパイルしてインストールします

理想的な状況

3.0.0は最初にインストールされました。まず、ソースコードパッケージ https://github.com/opencv/opencv/archive/3.0.0.zipを ダウンロード し、サーバーにアップロードして、解凍します。そのディレクトリを入力し、ビルドフォルダを作成して入力し、コンパイルスクリプトを実行します
(base) root@ubuntu:/home/szc/opencv/opencv-3.0.0/build# cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

すべてが正常であれば、成功し、現在のディレクトリにMakefileがあります。

次に、インストールコマンドを実行すると、すべてがうまくいきます
(base) root@ubuntu:/home/szc/opencv/opencv-3.0.0/build# make -j6 && make install

上記のプロセスは私の仮想マシンでは正常であり、完了後のスクリーンショットを以下に示します。

 

エラー処理

しかし、サーバーで多数のエラーを報告しました。解決しようとしたプロセスは次のとおりです。

ヘッダーファイルをコピーする

コンパイル中に多くのヘッダーファイルが見つからないため、一部のサードパーティライブラリをインストールしてから、一部のヘッダーファイルを/ usr / local / includeディレクトリにコピーする必要があります。
root@sundata:/data/szc/opencv/opencv-3.0.0/build# apt-get install libpt-dev apcalc-dev linux-oracle-headers-4.15.0-1054 
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp -r /usr/include/x86_64-linux-gnu/libavformat /usr/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/calc/cmath.h /usr/local/include/
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/c++/v1/* /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /snap/gnome-3-34-1804/36/usr/include/c++/6/cmath /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/src/linux-oracle-headers-4.15.0-1054/include/uapi/linux/videodev2.h /usr/local/include/linux/
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/ptlib/videoio.h /usr/local/include/sys/
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/ptbuildopts.h /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp -r /usr/include/ptlib /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/ptlib.h /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /snap/gnome-3-34-1804/36/usr/include/c++/6/bits/cpp_type_traits.h /usr/local/include/bits
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp -r /usr/src/linux-hwe-5.4-headers-5.4.0-48/include/linux/* /usr/local/include/linux/
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp -r /usr/src/linux-hwe-5.4-headers-5.4.0-48/include/uapi /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /snap/gnome-3-34-1804/36/usr/lib/gcc/x86_64-linux-gnu/6/include/stdbool.h /usr/local/include
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/local/include/c++/6/ext/atomicity.h /usr/local/include/ext/

libpjproject-devはlibpt-devと相互に排他的であるように見えるため、後者をインストールする前に、後者の関連ファイルを/ usr / local / includeディレクトリにコピーすることに注意してください。

root@sundata:/data/szc/opencv/opencv-3.0.0/build# apt-get install libpjproject-dev
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/pjmedia/videodev.h /usr/local/include/linux/
root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp -r /usr/include/pj* /usr/local/include

ヘッダーファイルを変更します

一部のファイルは変更する必要があります。

1)、/ usr / include / bits / cpp_type_traits.h、#pragmaを1回追加し、extern "C ++" {の上下にマクロ判定を追加します。
#pragma once
#ifdef __cplusplus
extern "C++" {
.....

} // extern "C++"
#endif

....

2)、/ usr / local / include / wchar.h、wchar_tのマクロ定義を最初の特定の行に追加します

....
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif


#define int32 wchar_t


#include_next <wchar.h>
....

3)、/ usr / local / include / ptlib / unix / ptlib / contains.h、およびヘッダーファイル

#include <wchar.h>
4)不明なタイプのextern "C ++"、名前空間、クラス、_LIBCPP_BEGIN_NAMESPACE_STDなどでエラーが報告された場合、唯一の解決策は/ usr / local / includeディレクトリで報告されたファイルを変更することです。
  • 不明なタイプextern "C ++":type_traits、cmathを変更し、#ifdef __cplusplus ...を使用します。#endif wrap extern "C ++" {}
  • 名前空間stdを使用した不明なタイプ:ptlib / unix / ptlib / contains.hを変更し、#ifdef __cplusplus ...を使用します。#endif wrap using namespace std;
  •  不明なtype_LIBCPP_BEGIN_NAMESPACE_STD:アトミック、cctype、cstring、cstddef、cstdio、cstdint、iosfwd、ios、iterator、cstdlib、cwctype、cwchar、memory、stdexcept、tuple、typeinfo、type_traits、utility、___ tuple、___ tuple、___ tupleを変更します。 iostream、iomanip、マップファイル、#ifdef __cplusplus ....#endifを使用して_LIBCPP_BEGIN_NAMESPACE_STDをラップします....._ LIBCPP_END_NAMESPACE_STD、アトミックヘッダーファイル#include <stdbool.h>、コメントアウト#error <atomic>は実装されていません。stdexceptファイルは、最初の_LIBCPP_BEGIN_NAMESPACE_STDから最後の_LIBCPP_END_NAMESPACE_STDまで、基本的にはファイルの最後にあります。
  • 不明なタイプの名前空間std:__ nullptr、exception、initializer_list、typeinfoファイルを変更し、#ifdef __cplusplus ....#endifを使用してすべての名前空間stdをラップします{}
  •  #include_next <stddef.h> stddef.hファイルが見つかりません。cstddefファイルを変更し、#include_next <stddef.h>を#include <stddef.h>に変更してください。
  • 不明なタイプ_LIBCPP_PUSH_MACROS:__ string、__ bit_reference、__ mutex_base、__ threading_support、__ split_buffer、__ tree、string_view、string、streambuf、algorithm、memory、limits、locale、bitset、mutex、chrono、ratio、istream、sstream、vector、filesを変更します。 ifdef __cplusplus ....#endifをラップして_LIBCPP_PUSH_MACROSと_LIBCPP_BEGIN_NAMESPACE_STD ..... _LIBCPP_POP_MACROS ..
5)個別に変更するファイルがいくつかあります。
  • 新しいファイル:
  1.  #ifdef __cplusplus .... #endifを使用して、コンテンツを#if!defined(_LIBCPP_ABI_MICROSOFT)|| defined(_LIBCPP_NO_VCRUNTIME)....#endif //!_ LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME
  2. #ifdef __cplusplus ....#endifを使用して_LIBCPP_BEGIN_NAMESPACE_STDをラップします....._ LIBCPP_END_NAMESPACE_STD ..
  • __functional_baseファイル:#ifdef __cplusplus ....#endifを使用して_LIBCPP_BEGIN_NAMESPACE_STDをラップします....._ LIBCPP_END_NAMESPACE_STDとconstexpr
  • ext / atomicity.hファイル:#ifdef __cplusplus ....#endifを使用して名前空間をラップします
  • ptlib /ディレクトリ:変更するファイルがたくさんあります。変更したファイルはネットワークディスクから直接ダウンロードできます:リンク:https://pan.baidu.com/s/1guHSn6iVRGyrw8enXead5Q、抽出コード:hsw3
  • sys / videoio.hファイル:#ifdef __cplusplus ....#endifを使用してクラスPColourConverterをラップします; ......クラスPVideoFont:2つのクラス間のパブリックPObjectコンテンツ
  • クラス:__ debugファイルを変更し、クラスを#ifdef __cplusplus ...でラップします。#endif _LIBCPP_EXCEPTION_ABI __libcpp_debug_exception;

OpenCVファイルを変更する

以下のファイルはopencv3.0.0のディレクトリにあります

1)、modules / cudev / include / opencv2 / cudev / common.hpp、およびヘッダーファイル
#include <cuda_fp16.h>

2)、cmake / FindCUDA.cmake

まず第一に:
  find_cuda_helper_libs(nppi)

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)

その後:

  set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

  set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

やっと:

  unset(CUDA_nppi_LIBRARY CACHE)

  unset(CUDA_nppial_LIBRARY CACHE)
  unset(CUDA_nppicc_LIBRARY CACHE)
  unset(CUDA_nppicom_LIBRARY CACHE)
  unset(CUDA_nppidei_LIBRARY CACHE)
  unset(CUDA_nppif_LIBRARY CACHE)
  unset(CUDA_nppig_LIBRARY CACHE)
  unset(CUDA_nppim_LIBRARY CACHE)
  unset(CUDA_nppist_LIBRARY CACHE)
  unset(CUDA_nppisu_LIBRARY CACHE)
  unset(CUDA_nppitc_LIBRARY CACHE)

3)、cmake / OpenCVDetectCUDA.cmake

  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0 2.1(2.0)")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    if(${CUDA_VERSION} VERSION_LESS "5.0")
      set(__cuda_arch_bin "3.0")
  else()
      set(__cuda_arch_bin "3.0 3.5")
  endif()

  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")

4)、cmake / OpenCVFindLibsVideo.cmake

まず第一に:
    
CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG)
    
CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_FFMPEG_FFMPEG)
第二に:
      
if(EXISTS /usr/include/ffmpeg/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE)
     
if(EXISTS /usr/local/include/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE)
5)cmake / OpenCVDetectCXXCompiler.cmakeファイルを次のコンテンツに置き換えます(CMakeの一致で式* 100 +を解析できないというエラーに対応します)
# ----------------------------------------------------------------------------
# Detect Microsoft compiler:
# ----------------------------------------------------------------------------
if(CMAKE_CL_64)
    set(MSVC64 1)
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  set(CMAKE_COMPILER_IS_GNUCXX 1)
  set(CMAKE_COMPILER_IS_CLANGCXX 1)
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
  set(CMAKE_COMPILER_IS_GNUCC 1)
  set(CMAKE_COMPILER_IS_CLANGCC 1)
endif()
if("${CMAKE_CXX_COMPILER};${CMAKE_C_COMPILER}" MATCHES "ccache")
  set(CMAKE_COMPILER_IS_CCACHE 1)
endif()

# ----------------------------------------------------------------------------
# Detect Intel ICC compiler -- for -fPIC in 3rdparty ( UNIX ONLY ):
#  see  include/opencv/cxtypes.h file for related   ICC & CV_ICC defines.
# NOTE: The system needs to determine if the '-fPIC' option needs to be added
#  for the 3rdparty static libs being compiled.  The CMakeLists.txt files
#  in 3rdparty use the CV_ICC definition being set here to determine if
#  the -fPIC flag should be used.
# ----------------------------------------------------------------------------
if(UNIX)
  if  (__ICL)
    set(CV_ICC   __ICL)
  elseif(__ICC)
    set(CV_ICC   __ICC)
  elseif(__ECL)
    set(CV_ICC   __ECL)
  elseif(__ECC)
    set(CV_ICC   __ECC)
  elseif(__INTEL_COMPILER)
    set(CV_ICC   __INTEL_COMPILER)
  elseif(CMAKE_C_COMPILER MATCHES "icc")
    set(CV_ICC   icc_matches_c_compiler)
  endif()
endif()

if(MSVC AND CMAKE_C_COMPILER MATCHES "icc|icl")
  set(CV_ICC   __INTEL_COMPILER_FOR_WINDOWS)
endif()

# ----------------------------------------------------------------------------
# Detect GNU version:
# ----------------------------------------------------------------------------
if(CMAKE_COMPILER_IS_CLANGCXX)
  set(CMAKE_GCC_REGEX_VERSION "4.2.1")
  set(CMAKE_OPENCV_GCC_VERSION_MAJOR 4)
  set(CMAKE_OPENCV_GCC_VERSION_MINOR 2)
  set(CMAKE_OPENCV_GCC_VERSION 42)
  set(CMAKE_OPENCV_GCC_VERSION_NUM 402)

  execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -v
                  ERROR_VARIABLE CMAKE_OPENCV_CLANG_VERSION_FULL
                  ERROR_STRIP_TRAILING_WHITESPACE)

  string(REGEX MATCH "version.*$" CMAKE_OPENCV_CLANG_VERSION_FULL "${CMAKE_OPENCV_CLANG_VERSION_FULL}")
  string(REGEX MATCH "[0-9]+\\.[0-9]+" CMAKE_CLANG_REGEX_VERSION "${CMAKE_OPENCV_CLANG_VERSION_FULL}")

elseif(CMAKE_COMPILER_IS_GNUCXX)
  execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
                OUTPUT_VARIABLE CMAKE_OPENCV_GCC_VERSION_FULL
                OUTPUT_STRIP_TRAILING_WHITESPACE)

  execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -v
                ERROR_VARIABLE CMAKE_OPENCV_GCC_INFO_FULL
                OUTPUT_STRIP_TRAILING_WHITESPACE)

  # Typical output in CMAKE_OPENCV_GCC_VERSION_FULL: "c+//0 (whatever) 4.2.3 (...)"
  # Look for the version number, major.minor.build
  string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
  if(NOT CMAKE_GCC_REGEX_VERSION)#major.minor
    string(REGEX MATCH "[0-9]+\\.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
  endif()

  if(CMAKE_GCC_REGEX_VERSION)
    # Split the parts:
    string(REGEX MATCHALL "[0-9]+" CMAKE_OPENCV_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}")

    list(GET CMAKE_OPENCV_GCC_VERSIONS 0 CMAKE_OPENCV_GCC_VERSION_MAJOR)
    list(GET CMAKE_OPENCV_GCC_VERSIONS 1 CMAKE_OPENCV_GCC_VERSION_MINOR)
  else()#compiler returned just the major version number
    string(REGEX MATCH "[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_OPENCV_GCC_VERSION_FULL}")
    if(NOT CMAKE_GCC_REGEX_VERSION)#compiler did not return anything reasonable
      set(CMAKE_GCC_REGEX_VERSION "0")
      message(WARNING "GCC version not detected!")
    endif()
    set(CMAKE_OPENCV_GCC_VERSION_MAJOR ${CMAKE_GCC_REGEX_VERSION})
    set(CMAKE_OPENCV_GCC_VERSION_MINOR 0)
  endif()

  set(CMAKE_OPENCV_GCC_VERSION ${CMAKE_OPENCV_GCC_VERSION_MAJOR}${CMAKE_OPENCV_GCC_VERSION_MINOR})
  math(EXPR CMAKE_OPENCV_GCC_VERSION_NUM "${CMAKE_OPENCV_GCC_VERSION_MAJOR}*100 + ${CMAKE_OPENCV_GCC_VERSION_MINOR}")
  message(STATUS "Detected version of GNU GCC: ${CMAKE_OPENCV_GCC_VERSION} (${CMAKE_OPENCV_GCC_VERSION_NUM})")

  if(WIN32)
    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
              OUTPUT_VARIABLE OPENCV_GCC_TARGET_MACHINE
              OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(OPENCV_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
      set(MINGW64 1)
    endif()
  endif()
endif()

if(MSVC64 OR MINGW64)
  set(X86_64 1)
elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
  set(X86 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
  set(X86_64 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*")
  set(X86 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
  set(ARM 1)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
  set(AARCH64 1)
endif()

# Workaround for 32-bit operating systems on 64-bit x86_64 processor
if(X86_64 AND CMAKE_SIZEOF_VOID_P EQUAL 4 AND NOT FORCE_X86_64)
  message(STATUS "sizeof(void) = 4 on x86 / x86_64 processor. Assume 32-bit compilation mode (X86=1)")
  unset(X86_64)
  set(X86 1)
endif()

# Similar code exists in OpenCVConfig.cmake
if(NOT DEFINED OpenCV_STATIC)
  # look for global setting
  if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
    set(OpenCV_STATIC OFF)
  else()
    set(OpenCV_STATIC ON)
  endif()
endif()

if(MSVC)
  if(CMAKE_CL_64)
    set(OpenCV_ARCH x64)
  elseif((CMAKE_GENERATOR MATCHES "ARM") OR ("${arch_hint}" STREQUAL "ARM") OR (CMAKE_VS_EFFECTIVE_PLATFORMS MATCHES "ARM|arm"))
    # see Modules/CmakeGenericSystem.cmake
    set(OpenCV_ARCH ARM)
  else()
    set(OpenCV_ARCH x86)
  endif()
  if(MSVC_VERSION EQUAL 1400)
    set(OpenCV_RUNTIME vc8)
  elseif(MSVC_VERSION EQUAL 1500)
    set(OpenCV_RUNTIME vc9)
  elseif(MSVC_VERSION EQUAL 1600)
    set(OpenCV_RUNTIME vc10)
  elseif(MSVC_VERSION EQUAL 1700)
    set(OpenCV_RUNTIME vc11)
  elseif(MSVC_VERSION EQUAL 1800)
    set(OpenCV_RUNTIME vc12)
  elseif(MSVC_VERSION EQUAL 1900)
    set(OpenCV_RUNTIME vc14)
  elseif(MSVC_VERSION EQUAL 1910)
    set(OpenCV_RUNTIME vc15)
  endif()
elseif(MINGW)
  set(OpenCV_RUNTIME mingw)

  if(MINGW64)
    set(OpenCV_ARCH x64)
  else()
    set(OpenCV_ARCH x86)
  endif()
endif()

6)エラーが報告された場合要求されたモジュールは利用できません:vtkRenderingOpenGL次に、/ cmake / OpenCVDetectVTK.cmakeファイルを変更し、変更します

find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport NO_MODULE)

への変更

find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL2 vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport NO_MODULE)

7)サポートされていないgpuアーキテクチャcompute_20としてエラーが報告された場合、私のcudaは10.0であるため、最初にcmake / OpenCVDetectCUDA.cmakeファイルを変更し、_generationsを設定した後にPascalを追加する必要があります

set(_generations "Fermi" "Kepler" "Pascal")

次に、CUDA_GENERATIONの判定ブランチでPascalに対応する計算能力(6.0および6.1)を想定します。

  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")
  elseif(CUDA_GENERATION STREQUAL "Pascal")
    set(__cuda_arch_bin "6.0 6.1")

最後に、cmakeのコンパイル時にCUDAアーキテクチャが指定されます

-D CUDA_GENERATION=Pascal

ファイルメソッドの変更

最後に、これらの問題の解決策について話します。

1)特定のヘッダーファイル(bits / cpp_type_traits.hなど)が見つからない場合は、最初にファイルの場所を特定します
root@sundata:/home/sundata# locate bits/cpp_type_traits.h
/snap/gnome-3-34-1804/36/usr/include/c++/6/bits/cpp_type_traits.h
/usr/include/c++/3.4/bits/cpp_type_traits.h
/usr/include/c++/5/bits/cpp_type_traits.h
/usr/include/c++/7/bits/cpp_type_traits.h
/usr/local/include/c++/6/bits/cpp_type_traits.h

次に、1つを見つけて/ usr / local / includeディレクトリにコピーします(bits / cpp_type_traits.hはここにはないので、/ usr / local / include / bitsディレクトリにコピーします)

root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /snap/gnome-3-34-1804/36/usr/include/c++/6/bits/cpp_type_traits.h /usr/local/include/bits

ローカルで見つからない場合は、サードパーティのライブラリ(sys / videoio.hなど)をインストールしてこのファイルを追加する必要があることを意味します。最初にapt-file(お持ちでない場合はapt-getを使用してインストール)を使用して、このヘッダーファイルに含まれているサードパーティライブラリと、インストール後に配置されているパスを確認します

root@sundata:/home/sundata# apt-file search videoio.h
libopencv-videoio-dev: /usr/include/opencv2/videoio.hpp
libopencv-videoio-dev: /usr/include/opencv2/videoio/videoio.hpp
libpt-dev: /usr/include/ptlib/videoio.h
opencv-doc: /usr/share/doc/opencv-doc/html/dd/de7/group__videoio.html
opencv-doc: /usr/share/doc/opencv-doc/html/df/d2c/tutorial_table_of_content_videoio.html

libpt-devのみが選択できるように、ヘッダーファイルを選択する必要があります。apt-getでインストールした後、このファイルをインストール後のパスから/ usr / local / includeにコピーします(sys / videoio.hが見つからないため、usr / local / include / sys /ディレクトリにコピーする必要があります) )

root@sundata:/data/szc/opencv/opencv-3.0.0/build# cp /usr/include/ptlib/videoio.h /usr/local/include/sys/

2)、フィールドが見つかりません。定義前に使用されています

インターネットを検索してこのフィールドがどのファイルにあるかを調べ、システム内でこのファイルの位置を見つけます。内容を確認した後、このフィールドでファイルをコピーするか、コピー後に変更します。
たとえば、wchar_tの場合、インターネットを長時間検索した後、wchar.hヘッダーファイルでこのフィールドを見つけました。上記の方法を使用してwchar.hを/ usr / loca / includeディレクトリにコピーしましたが、簡単ではありませんでした。それはwchar.hにもあったからです。wchar_tはありません。そこで、システム内の他のwchar.h(パスは/snap/gnome-3-34-1804/36/usr/include/x86_64-linux-gnu/bits/wchar.h)を調べたところ、そのようなものがあることがわかりました。セクションワード
/* The fallback definitions, for when __WCHAR_MAX__ or __WCHAR_MIN__
   are not defined, give the right value and type as long as both int
   and wchar_t are 32-bit types.  Adding L'\0' to a constant value
   ensures that the type is correct; it is necessary to use (L'\0' +
   0) rather than just L'\0' so that the type in C++ is the promoted
   version of wchar_t rather than the distinct wchar_t type itself.
   Because wchar_t in preprocessor #if expressions is treated as
   intmax_t or uintmax_t, the expression (L'\0' - 1) would have the
   wrong value for WCHAR_MAX in such expressions and so cannot be used
   to define __WCHAR_MAX in the unsigned case.  */

__WCHAR_MAX__または__WCHAR_MIN__が定義されていない場合、wchar_tとintが両方とも32ビットタイプである限り、__ WCHAR_MAX__または__WCHAR_MIN__が正しく割り当てられ、アップグレードされたC ++バージョンではwchar_tが割り当てられていません。明確に定義されています。次に、32ビットのwchar_tを定義するのを手伝わなければならなかったので、ヘッダーファイルの2番目の部分を変更するための変更があります

3)、不明な型名 'クラス'クラス:
私が見つけられないのは、クラス、名前空間、テンプレートなどのC ++キーワードであり、コンパイラーによって出力された情報は、私が構成したg ++を明確に見つけることができます。そのため、C ++コードのコンパイルに常にcを使用する理由がわかりません。エラーを報告する必要があります。したがって、私の解決策は、#ifdef __cplusplus .... #endifを使用して、エラーキーワード定義の内容をラップすることです。このマクロ判断の意味は、現在のコンパイラがc ++コンパイラg ++を使用しているかどうかを判断することです。実行します。マクロが内容を判断します。そうでない場合は実行されません。
4)、その他
インターネットで他のすべてを検索するだけです

より良い解決策-OpenCVバージョンを変更する

これらの不可解なエラーが発生した場合、最善の解決策は実際にOpenCVをアップグレードすることです:上記の方法のいずれも機能しない場合、または解決できないエラーが発生した場合(互換性のない10.0CUDAでOpenCV3.0.0をコンパイルすることです)、更新できますopencvのバージョン。以下の操作は、上記の変更なしで、つまり最初から(ffmpegをコンパイルしてインストールした後)実行されます。

3.4.1バージョンのOpenCVおよびOpenCV_contrib

OpenCV3.4.1とOpenCV_contrib3.4.1のクローンを作成しました

xfeatures2dソースファイルをダウンロードする

いくつかのファイルをダウンロードし(リンク: https  ://pan.baidu.com/s/1oT36HtuRiYPEgNbgJvrOqg抽出コード:gsg2)、opencv_contrib-3.4.1 / modules / xfeatures2d / srcディレクトリにコピーします。

OpenCVファイルを変更する

1)OpenCV-3.4.1のルートディレクトリにあるCMakeLists.txtファイルを変更し、576行目に追加します。
...
include_directories("modules")

# ----------------------------------------------------------------------------
#  Path for build/platform -specific headers
# ----------------------------------------------------------------------------
....

2)ファイルopencv-3.4.1 / modules / stitchingディレクトリのCMakeLists.txtを変更し、次の文を追加します。

include_directories("/home/rtlab/szc/opencv-3.4.1/modules/features2d/include/")

コンパイルしてインストールする

次に、コマンドラインを使用してコンパイルとインストールを行います

root@rtlab-computer:/home/rtlab/szc/opencv-3.4.1/build# make -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D ENABLE_PRECOMPILED_HEADERS=OFF -D CUDA_GENERATION=Pascal -D OPENCV_EXTRA_MODULES_PATH=/home/rtlab/szc/opencv_contrib-3.4.1/modules -D WITH_CUDA=ON -D WITH_OPENCL=ON ..
root@rtlab-computer:/home/rtlab/szc/opencv-3.4.1/build# make -j10 && make install

現時点ではコンパイルは非常にスムーズです

構成

インストール後、テストケースを実行できない場合は、いくつかの環境変数を構成する必要があります
1)、/ etc / ld.so.confファイルを変更し 、文を追加します
include /usr/local/lib

2)、/ etc / profileを変更します

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

3)、有効にする

(base) root@ubuntu:/home/szc/opencv/opencv-3.0.0/build# ldconfig
(base) root@ubuntu:/home/szc/opencv/opencv-3.0.0/build# source /etc/profile

テスト

root@ubuntu:/home/szc/opencv/opencv-3.0.0/build# pkg-config opencv --modversion

バージョン番号が正しく出力できれば成功します

結論

コンパイルしてインストールするOpenCVバージョンを選択するときは、CUDAバージョンがgithubのcmake / OpenCVDetectCUDA.cmakeファイル(たとえば、6.Xの計算能力を持つPascal)に含まれているかどうかを確認するのが最善です。多くの迂回路を避けることができます。さらに、OpenCVの一部のテストケースは、データが不足しているために実行できません。その他のテストケースは、さまざまな理由で実行できませんが、バージョン番号が正しく出力されている限り、インストールが成功したことを示しているはずです。

おすすめ

転載: blog.csdn.net/qq_37475168/article/details/109894648