摘要:本文实现了用homebrew安装OpenCV,然后在terminal中用cmake编译一个简单的程序
不是用homebrew安装的也可以看,我试图写了一些关键要素,应该可以依葫芦画瓢的自己编译成功
环境
macOS:10.14.1
OpenCV:4.0.1
cmake:3.12.2
安装OpenCV
在终端中输入
brew install opencv
安装完成之后的目录应该是/usr/local/Cellar/opencv
目录结构大致如下:
也是下面提到的cmake文件所在目录
cpp和cmake文件编写
我从官网上复制粘贴了一个最基础的程序,实现了打开指定位置图片并按q
退出的功能
注意不同版本的OpenCV有挺大的不同,比如OpenCV2和后面几个版本的库名称有很大区别,所以在include的时候要注意
如果你发现最后找不到include的库,很有可能是OpenCV的版本问题,建议去官网找对应版本的例子
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
String imageName( "/Users/air/Desktop/WechatIMG15.jpeg" ); // 改成你想要的图片
if( argc > 1)
{
imageName = argv[1];
}
Mat image;
image = imread( imageName, IMREAD_COLOR ); // Read the file
if( image.empty() ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
为了实现这个程序,我们用cmake来进行编译
首先就是要在同级目录下写一个CMakeLists.txt
的文件,内容如下
project( s )
set(OpenCV_DIR "/usr/local/Cellar/opencv/4.0.1/lib/cmake/opencv4")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
find_package( OpenCV REQUIRED )
add_executable( s s.cpp )
target_link_libraries( s ${OpenCV_LIBS} )
注释:
- s是我随便写的23333
- 第一行project不是强制性的,最好加上
- 第二行set很重要,因为在opencv编译好后,所在目录中一般会有一个叫
OpenCVConfig.cmake
的文件,这个文件中指定了CMake要去哪里找OpenCV,其.h文件在哪里等。只要让CMake找到这个文件,这个文件就指定了Opencv的所有路径,因此设置OpenCV_DIR
是为了包含OpenCVConfig.cmake
的目录,因为我是用homebrew安装的,所以在我这里,目录就是/usr/local/Cellar/opencv/4.0.1/lib/cmake/opencv4
。 - 所以!!如果你不是用homebrew安装的,只需要找到这个文件所在目录替换即可
-
set(OpenCV_DIR...)
必须在find_package之前,因为本来的默认路径很可能不是你想要的那个 - 第三行的set也很重要,因为该opencv版本需要c++11。如果是opencv2那就不需要这行了
在终端中实现
- 进入存放上面两个文件的目录
cd Desktop
- 编译
cmake .
make
- 你会发现在同级目录中出现了很多文件,为了好看,你可以在第二步前创建文件夹用来囊括所有过程文件
mkdir build
cd build
cmake ..
注意这里是两个点,为了返回上层目录
make
如果没有报错,就可以产生一个可执行文件了