在 Windows 上将 OpenCV 与 Clion IDE 结合使用

use OpenCV with Clion IDE on Windows

实际上,我正在寻找一种方法来使用 JetBrains 的 Clion 和 OpenCV 创建应用程序。

我已经用 Choco 安装了 OpenCV,所以我在 C:\opencv 中拥有了所有的东西

这是我和 Clion 的项目

CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(test)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories("C:\opencv\build\include\")

FIND_PACKAGE( OpenCV REQUIRED core highgui imgproc)
set(OpenCV_FOUND TRUE)

set(SOURCE_FILES main.cpp)
add_executable(prog ${SOURCE_FILES})

和 main.cpp:

#include <opencv2/opencv.hpp>

int main() {

    cv::Mat img = cv::imread("./test.jpg", -1);
    cv::imshow("Mon image", img);
    cv::waitKey(0);
    return 0;
}

构建的响应是:

undefined reference to `cv::imread(cv::String const&, int)'

所有 OpenCV 函数的未定义错误

你知道为什么它不起作用吗?

首先你需要CMake.
然后你需要一个你选择的编译器 (MinGW, Visual Studio, ...).

  1. 下载 OpenCV 源文件。 Link
  2. 解压缩到 C:\opencv(或您选择的文件夹)
  3. 打开 CMake 和 select 源(2. 的目录)并构建例如 C:\opencv\mingw-buildC:\opencv\vs-x64-build。根据您的配置选择一个。
  4. 单击 Configure 和 select 根据您的编译器生成的生成器。 MinGW Makefiles 如果是 MingGW 或 Visual Studio ... 如果你使用 Visual Studio 等等...
    (如果您在使用 MinGW 时遇到问题,请确保将 minGW/bin 目录添加到标有 'PATH' 的环境路径中)
  5. 等待配置完成,编辑您需要的属性(在我的情况下,我不需要测试、文档和 python)。
    再次单击 Configure。当一切都是白色时,单击 Generate 否则编辑红色字段。
  6. 打开 cmd 和 dir 以构建 3.
    的目录 如果您选择 Visual Studio 打开生成的解决方案。
  7. 编译库。 运行 mingw32-make(或mingw64-make)或者如果您选择的编译器是 MSVC,则从 Visual Studio 中生成的解决方案构建 BUILD_ALL 项目。
    这需要一段时间。
  8. 完成后,运行 mingw32-make install(或mingw64-make install)。如果您选择 Visual Studio,则需要构建 INSTALL 项目。
    这将创建一个安装文件夹,其中包含构建您自己的 OpenCV 应用程序所需的一切。
  9. 向系统 PATH 添加 C:\opencv\mingw-build\install\x86\mingw\bin
    重新启动电脑。
  10. 设置 CLion:

CMakeLists.txt:

project(test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# Where to find CMake modules and OpenCV
set(OpenCV_DIR "C:\opencv\mingw-build\install")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(test_cv main.cpp)

# add libs you need
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs) 

# linking
target_link_libraries(test_cv ${OpenCV_LIBS})

main.cpp:

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

int main(int argc, char** argv)
{
    if(argc != 2)
    {
        std::cout << "Usage: display_image ImageToLoadAndDisplay" << std::endl;
        return -1;
    }

    cv::Mat frame;
    frame = cv::imread(argv[1], IMREAD_COLOR); // Read the file

    if(!frame) // Check for invalid input
    {
        std::cout << "Could not open or find the frame" << std::endl;
        return -1;
    }

    cv::namedWindow("Window", WINDOW_AUTOSIZE); // Create a window for display.
    cv::imshow("Window", frame); // Show our image inside it.

    cv::waitKey(0); // Wait for a keystroke in the window
    return 0;
}

构建并 运行 main.cpp.

所有路径取决于您在 2.3. 中所做的设置。您可以根据需要更改它们。

更新 1: 我更新了 post 以使用您选择的编译器。

建议: 使用像 Conan 这样的包管理器让生活更轻松。

我只想在 daB0bby 的回答中再补充一件事。少数 Min-GW 编译器不支持 C++ 版本 11 或更高版本。 OpenCV 中的线程需要此版本。所以我会建议使用 TDM-GCC Compiler 而不是 MinGW 编译器。安装此编译器并将路径 C:\TDM-GCC-64\bin 设置为系统的环境变量。