Mac clion 环境下配置搭建OpenCV(源码编译版)

前言

发现其它文章都是直接brew install opencv的,感觉这并不负责任,这能让其它程序员学到什么?

这么做编译、链接这个过程直接成了黑盒子。

所以我决定写这篇文章,将问题分析透彻。

一、资源准备

  • 下载opencv源码包,笔者这里版本是2.4.13.6(OpenCV官网

点击Releases链接,在列出的各版本中,找到自己想要的那个版本,点击Sources下载源码

OpenCV 编译教程动态链接库_opencv

点击Download链接

OpenCV 编译教程动态链接库_ide_02

找到mac版进行下载,并安装

二、编译OpenCV源码,得到头文件和动态链接库

  • 使用cmake工具编译

选择编译器(这里用默认的就好,不像windows,有vs版和MinGW版)

OpenCV 编译教程动态链接库_ide_03

让它跑,首次Configure完成后,控制台下只要没有error,(红色的warning无视即可)无脑再次点击Configure按钮

OpenCV 编译教程动态链接库_OpenCV 编译教程动态链接库_04

再次完成后,最后再根据条件再次确认下配置,记得把OpenGL的支持加上

OpenCV 编译教程动态链接库_OpenCV_05

最后点击Generate按钮生成makefile文件(有了这个文件就可以愉快的 make install 了)

  • 到你设置的编译输出目录下,用bash命令执行 make install 命令吧
  • 执行完后你发现你的/usr/local目录下多了include、lib两个目录,并且底下有opencv相关的一些东西,这些都是你以上作出的劳动成果

三、配置clion环境

  • 1.新建一个c++ 11的项目
  • 2.找到项目根路径下的CMakeLists.txt文件(怎么写?参照大神整理的CMakeList教程
cmake_minimum_required(VERSION 3.17)
project(OpenCVDemo)

set(CMAKE_CXX_STANDARD 11)

# 执行你额外需要包含的.h文件的目录 -- 可多个,每行都是一个
include_directories(
        /usr/local/include
        /usr/local/include/opencv
        /usr/local/include/opencv2
)

# 执行你额外需要包含的.dylib、.a、.so等静态、动态库文件的目录 -- 可多个,每行都是一个
link_directories(
        /usr/local/lib
)

# 设置主启动库
add_executable(OpenCVDemo main.cpp)

# 逐个添加你的库 链接到主启动库
# 怎么来?
# 在/usr/local/lib目录下执行命令 ls -lL | grep opencv (这个大L是剔除链接文件的,我们只要文件主体)
# 得到的去头去尾后就是下面的目录了(.a、.dylib、.so等后缀去掉,lib开头去掉),为什么?linux、unix规定!
target_link_libraries(
        OpenCVDemo # 这个是你的项目库,别忘了
        opencv_ts
        opencv_calib3d.2.4.13
        opencv_contrib.2.4.13
        opencv_core.2.4.13
        opencv_features2d.2.4.13
        opencv_flann.2.4.13
        opencv_gpu.2.4.13
        opencv_highgui.2.4.13
        opencv_imgproc.2.4.13
        opencv_legacy.2.4.13
        opencv_ml.2.4.13
        opencv_nonfree.2.4.13
        opencv_objdetect.2.4.13
        opencv_ocl.2.4.13
        opencv_photo.2.4.13
        opencv_stitching.2.4.13
        opencv_superres.2.4.13
        opencv_video.2.4.13
        opencv_videostab.2.4.13
)
  • 3.写测试代码,编译执行
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace cv;

int main() {
    // 构造一个视频对象,0代表从摄像头获取
    VideoCapture capture(0);

    while(1){
        // 创建空的mat结构
        Mat mat;
        // >> 是重载运算符函数,将帧从视频流中取出
        capture >> mat;
        // 显示 mat 到OpenCV创建的,名为"视频"的窗口中
        imshow("视频", mat);
        // 每帧30毫秒,试下效果,可自己微调
        cvWaitKey(30);
    }
}
  • 4.看下效果,额。。。老程序员就不发自拍图了。