【问题标题】:Installing opencv From Command Line (Windows)从命令行安装 opencv (Windows)
【发布时间】:2020-07-26 13:30:30
【问题描述】:

我正在尝试在项目中使用 opencv,但在“安装”它时遇到了问题。我已经提取了 opencv 文件并创建了一个小测试程序:

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

int main(int argc, char **argv){
    cv::Mat im=cv::imread((argc==2)? argv[1]: "testing.jpg",1);
    if (im.empty()){
        std::cout << "Cannot open image." << std::endl;
    } else {
        cv::imshow("image",im);
        cv::waitKey(0);
    }
    return 0;
}

为了编译程序,我使用了以下命令:

g++ -I"../../PortableGit/opt/opencv/build/include/" -L"../../PortableGit/opt/opencv/build/x64/vc15/lib" main.cpp -lopencv_core -lopencv_highgui -o main

我收到以下错误:

In file included from ../../PortableGit/opt/opencv/build/include/opencv2/core.hpp:3293:0,
                 from ../../PortableGit/opt/opencv/build/include/opencv2/highgui.hpp:46,
                 from ../../PortableGit/opt/opencv/build/include/opencv2/highgui/highgui.hpp:48,
                 from main.cpp:1:
../../PortableGit/opt/opencv/build/include/opencv2/core/utility.hpp:714:14: error: 'recursive_mutex' in namespace 'std' does not name
 a type
 typedef std::recursive_mutex Mutex;
              ^~~~~~~~~~~~~~~
../../PortableGit/opt/opencv/build/include/opencv2/core/utility.hpp:715:25: error: 'Mutex' is not a member of 'cv'
 typedef std::lock_guard<cv::Mutex> AutoLock;
                         ^~
../../PortableGit/opt/opencv/build/include/opencv2/core/utility.hpp:715:25: error: 'Mutex' is not a member of 'cv'
../../PortableGit/opt/opencv/build/include/opencv2/core/utility.hpp:715:34: error: template argument 1 is invalid
 typedef std::lock_guard<cv::Mutex> AutoLock;

我相信这与 mingw 二进制文件不再包含在 opencv 中有关。我缺少opencv/build/x86/mingw 目录。

我的问题是:

  • 如何在不安装某种 IDE 和/或 CMake 的情况下“安装”opencv 并使用它? (我更喜欢使用 vim 和命令行。)
  • 安装后,我使用什么命令来编译和链接程序与 opencv?

感谢任何帮助。

编辑

这似乎是 GCC 在 Windows 上实现 threads 的问题。使用 mingw-w64 代替 mingw 修复了 std::recursive_mutex 问题,但现在链接器找不到正确的文件。

/i686-w64-mingw32/bin/ld.exe: cannot find -lopencv_core
/i686-w64-mingw32/bin/ld.exe: cannot find -lopencv_highgui

【问题讨论】:

  • 看来OpenCV至少需要C++11。尝试使用-std=c++11 标志进行编译(或将编译器升级到至少 GCC 6.1,默认启用 C++14)
  • 我有 GCC 版本 6.3.0-1,我尝试使用 -std=c++11,但没有任何改变。
  • 这很奇怪,std::recursive_mutex 在 C++11 中可用。在 OpenCV 包含之前添加 #include &lt;mutex&gt; 可能会有所帮助(除非它真的只是环境问题),但是包含依赖项远非好。
  • 在没有opencv的情况下创建了一个小测试程序,即使使用#include &lt;mutex&gt;std::recursive_mutex也无法识别。
  • @Yksisarvinen 当你说环境问题时,我应该注意什么?

标签: c++ windows opencv command-line


【解决方案1】:

经过相当多的尝试,这就是我要做的事情。奇怪的是,即使我有一台 Windows 计算机,按照 LINUX 指南安装 opencv 比 WINDOWS 指南效果更好。

在没有 VS 的 Windows 上安装 OpenCV 的指南

注意:这是一个多步骤的过程,需要 3 个单独的工具。为这需要一段时间做好准备。

第 1 部分:准备好一切

  • 下载MinGW-w64
    • 在下载页面上,单击“MinGW-w64-builds”选项。不要点击“win-builds”选项。
    • 必须使用 MinGW-w64 的原因是因为它是 MinGW 编译器套件的更新版本,已针对 Windows 进行了改进。这意味着它支持posix线程系统,而标准的MinGW编译器只支持win32线程系统。 OpenCV 依赖于posix 线程系统,需要 MinGW-w64 编译器。
    • 将 MinGW-w64 zip 文件夹解压缩到一个目录。就我而言,它是PortableGit/opt/MinGW-w64
    • 此时,您可以将MingGW-w64/mingw32/bin 文件夹添加到您的路径中。 (假设这不会导致任何冲突。)如果这样做,您将不必不断指定g++ 可执行目录来运行它。这取决于您的判断。
  • 下载opencv release.
    • 不要下载windows的包,点击“来源”按钮
    • 将 opencv 源 zip 文件夹解压缩到一个目录。就我而言,它是PortableGit/opt/opencv-4.3.0
    • 还可以直接从repository 下载opencv_contrib 源文件。
    • 提取该文件夹并将其放置在顶级 opencv 文件夹中:在我的情况下为 PortableGit/opt/opencv-4.3.0/opencv_contrib
  • 下载CMake
    • 我下载了 zip 文件夹,但您可以根据需要下载安装程序。
    • 如果您下载了 CMake zip 文件夹,请解压缩该文件夹,或运行安装程序。我把我的 CMake 文件夹放在这里:PortableGit/opt/cmake-3.17.1-win32-x86
    • 此时,您可以将cmake-3.17.1-win32-x86/bin 文件夹添加到您的路径中。 (假设这不会导致任何冲突。)如果这样做,您将不必不断指定cmake 可执行目录来运行它。这取决于您的判断。

第 2 部分:构建 OpenCV

  • 导航到 opencv 目录并创建一个 build 文件夹并 cd 进入其中。
    • mkdir build &amp;&amp; cd build
  • 运行以下导出命令。
    • export CC=/PortableGit/MinGW-w64/mingw32/bin/gcc.exe
    • export CXX=/PortableGit/MinGW-w64/mingw32/bin/g++.exe
    • 这是为了确保下一个cmake 命令使用正确的编译器。
  • 从该文件夹中运行以下 cmake 命令: PortableGit/opt/cmake-3.17.1-win32-x86/cmake.exe -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DOPENCV_VS_VERSIONINFO_SKIP=1 -DOPENCV_EXTRA_MODULES_PATH="/PortableGit/opt/opencv-4.3.0/opencv_contrib/modules/" ..
    • -G 标志指定我们正在为 MinGW 编译器创建构建文件
    • -DCMAKE_BUILD_TYPE=Release 指定我们正在构建 opencv 的发布版本,而不是调试版本。
    • DOPENCV_EXTRA_MODULES_PATH 需要设置为opencv_contrib 文件夹内的模块文件夹。对我来说是PortableGit/opt/opencv-4.3.0/opencv_contrib/modules
    • DOPENCV_VS_VERSIONINFO_SKIP 指定不包括版本信息。如果未设置,编译器将抛出一个错误,抱怨没有版本文件。 (如下图供参考。)
gcc: error: long: No such file or directory
mingw32-make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1341:
modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
  • 如果成功,cmake 命令将像这样完成:
  • 现在再次从构建文件夹运行此命令:/PortableGit/opt/MinGW-w64/mingw32/bin/mingw32-make.exe -j7
    • mingw32-make.exe 是 Linux make 命令的 Windows 等效项。
    • -j7 选项以最多 7 个线程运行进程。
    • 这需要一段时间!我的笔记本电脑花了大约 20 分钟才完成
    • 如果make 命令以错误结束,请确保在继续进行任何故障排除之前重置您的构建目录。这是通过这一系列命令完成的
rm -rf build
mkdir build
cd build

第 3 部分:使用 OpenCV

  • 要在自己的项目中使用刚刚编译的 opencv 库,请使用项目主目录中的这些标志编译项目。
  • 请记住,您的编译器现在必须设置为 mingw-w64 编译器才能支持 opencv。
  • 为了便于阅读,我添加了缩进和换行符,但在终端中输入时不要包含换行符或缩进。
  • 链接器选项末尾的数字可能会根据您下载的 opencv 版本而改变。我下载了opencv-4.3.0,我的号码是430,但你的可能不一样。
PortableGit/opt/MinGW-w64/bin/g++.exe
    -I../../PortableGit/opt/opencv-4.3.0/include/
    -I../../PortableGit/opt/opencv-4.3.0/build/
    -I../../PortableGit/opt/opencv-4.3.0/modules/core/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/calib3d/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/dnn/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/features2d/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/flann/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/gapi/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/highgui/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/imgcodecs/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/imgproc/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/ml/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/objdetect/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/photo/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/stitching/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/ts/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/video/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/videoio/include/
    -I../../PortableGit/opt/opencv-4.3.0/modules/world/include/
    -L../../PortableGit/opt/opencv-4.3.0/build/lib/
    *.hpp
    *.cpp
    -lopencv_calib3d430
    -lopencv_core430
    -lopencv_dnn430
    -lopencv_features2d430
    -lopencv_flann430
    -lopencv_highgui430
    -lopencv_imgcodecs430
    -lopencv_imgproc430
    -lopencv_ml430
    -lopencv_objdetect430
    -lopencv_photo430
    -lopencv_stitching430
    -lopencv_video430
    -lopencv_videoio430
    -o
    main

或者你可以下载 VS。由你决定。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    更正 JackCamichael 的回答 这 2 个命令在 Windows 中不起作用

    export CC=/PortableGit/MinGW-w64/mingw32/bin/gcc.exe
    export CXX=/PortableGit/MinGW-w64/mingw32/bin/g++.exe
    

    这应该是

    setx -m CC C:\msys64\mingw64\bin\gcc.exe
    setx -m CXX C:\msys64\mingw64\bin\g++.exe 
    

    C:\msys64\mingw64\bin 是我机器上的mingw64 路径

    【讨论】:

      猜你喜欢
      • 2022-12-25
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2021-06-10
      • 2020-01-10
      • 2015-09-25
      相关资源
      最近更新 更多