在Windows上使用Clion IDE和OpenCV

19

实际上我正在寻找一种使用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函数都存在未定义的错误。

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


你设置了环境变量吗?你使用的编译器是什么?你没有将可执行文件与OpenCV_LIBS链接。 - dab0bby
对于 macOS 环境有任何喜爱吗? - WestCoastProjects
2个回答

47
首先需要下载CMake。然后根据个人选择下载编译器,如MinGWVisual Studio等。
  1. 下载OpenCV源代码。链接
  2. 解压到C:\opencv(或其它文件夹)。
  3. 打开CMake,选择源代码路径(即第2步的目录),选择构建路径,例如C:\opencv\mingw-buildC:\opencv\vs-x64-build。根据配置选择一个。
  4. 点击Configure,根据你的编译器选择生成器。如果使用MingGW,则选择MinGW Makefiles;如果使用Visual Studio,则选择Visual Studio ...等等。
    (如果在MingGW中遇到问题,请确保将minGW/bin目录添加到环境变量路径标签'PATH'中)
  5. 等待配置完成,编辑所需属性(在我的情况下,我不需要测试、文档和Python)。
    enter image description here 再次点击Configure。当一切都是白色时,点击Generate;否则编辑红色字段。
  6. 打开cmd并转到第3步的构建目录。
    如果选择了Visual Studio,则打开生成的解决方案。
  7. 编译库。运行mingw32-make(或mingw64-make),或在使用MSVC作为编译器时从Visual Studio生成的解决方案中构建BUILD_ALL项目。
    这需要一段时间。 enter image description here
  8. 完成后,运行mingw32-make install(或mingw64-make install)。如果你选择了Visual Studio,则需要构建INSTALL项目。
    这将创建一个安装文件夹,其中包括构建自己的OpenCV应用程序所需的所有内容。
  9. C:\opencv\mingw-build\install\x86\mingw\bin添加到系统PATH中。
    重新启动电脑。
  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:我更新了帖子,以便使用您选择的编译器。

建议:使用像Conan这样的软件包管理器可以让生活变得更加轻松。


5
你在上面提到过,“你需要下载FindOpenCV.cmake并将其添加到项目根目录下的cmake /中”。在我的情况下,我需要将FindOpenCV.cmake添加到CLion的CMake安装目录中, 对我来说它位于“C:\Program Files (x86)\JetBrains\CLion 2016.2.1\bin\cmake\share\cmake-3.6\Modules”这个位置,我在这个位置找到了许多其他的 Find*.cmake 文件。 - CODE-REaD
@MichałZiobro 可以的。 - dab0bby
为什么我不断收到关于cvRound()函数未定义引用的错误?我尝试了在opencv提取包中使用预构建库,以及从某些网站下载的其他cygiwn预编译包。我还尝试使用CMake gui进行编译,但它不断失败并出现一些线程相关函数的调用错误。在Windows上让它正常工作似乎非常困难;/我正在从macOS移植应用程序,并不认为使其正确工作会很难。 - Michał Ziobro
我尝试在Cygwin上运行它,但是不断看到多个错误,然后安装了MiniGW,一切都像魔法般地正常工作了。 - Sergei Basharov
2
有人在执行 cingw32-make 时遇到问题吗?我按照指南完全操作,但是出现了以下错误: \opencv\sources\3rdparty\libjpeg-turbo\src\jmemmgr.c:662:11: error: 'SIZE_MAX' undeclared (first use in this function) if (SIZE_MAX - maximum_space < new_space) ^~~~~~~~请问有什么想法吗?我不是真正的 C++ 开发者。 - Jakub Gruber
显示剩余4条评论

2

我想在 daB0bby 的回答中再补充一点。很少有MinGW编译器支持C++版本11或更高版本,而这个版本是OpenCV线程所必需的。因此,我建议使用TDM-GCC编译器代替MinGW编译器。安装此编译器并将路径C:\TDM-GCC-64\bin设置为系统环境变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接