之前在win10的vscode上搭建过opencv环境,这次试了下Mac下的,虽然踩坑不少,但最终还是成功了。下面是具体步骤:
一、Homebrew的安装
我试了官网下的安装代码,虽然能成功,但是速度很慢,而且有几个环境因为墙的原因,没有下载。最后我用的是清华大学的镜像。
教程可以参考:清华大学镜像安装homebrew
二、利用Homebrew安装opencv
有三个步骤:
brew install wget
brew install cmake
brew install opencv
如果下载速度很慢,可以尝试连上手机热点等方式,避免在学校校园网环境下下载(有墙)。
如果卡在
Updating Homebrew...
这个界面,可以直接按ctrl+c跳过,不影响后续下载。而且若是下载过程中进度条卡住了,可以ctrl+z终止,然后重新输入一下指令,会接着上次的断点继续下载。
检查安装结果
brew info opencv
输出如下:
如果有打红叉的,说明那个没有被安装,可以单独对他用一下brew install
三、配置VScode+opencv
Vscode配置c/c++环境在这里就不多说了,网上有很多。这里贴出我的四个json文件代码:
1.c_cpp_properties.json
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/Library/Developer/CommandLineTools/usr/include/c++/v1",
"/usr/local/include",
"/Library/Developer/CommandLineTools/usr/lib/clang/9.0.0/include",
"/usr/local/Cellar/opencv/4.2.0_1/include",
"/usr/local/Cellar/opencv/4.2.0_1/lib",
"/usr/local/Cellar/opencv/4.2.0_1/include/opencv4",
"/Library/Developer/CommandLineTools/usr/include",
"/usr/include",
],
"defines": [],
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
2.launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "c/c++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb",
"preLaunchTask": "c++"
}
]
}
3.tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "c++",
"command": "clang++",
"type": "shell",
"args": [
"${file}",
"-std=c++11",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out",
"-I",
"/usr/local/Cellar/opencv/4.2.0_1/include/opencv4/opencv",
"-I",
"/usr/local/Cellar/opencv/4.2.0_1/include/opencv4",
"-L",
"/usr/local/Cellar/opencv/4.2.0_1/lib",
"-l",
"opencv_gapi",
"-l",
"opencv_stitching",
"-l",
"opencv_aruco",
"-l",
"opencv_bgsegm",
"-l",
"opencv_bioinspired",
"-l",
"opencv_ccalib",
"-l",
"opencv_dnn_objdetect",
"-l",
"opencv_dnn_superres",
"-l",
"opencv_dpm",
"-l",
"opencv_highgui",
"-l",
"opencv_face",
"-l",
"opencv_freetype",
"-l",
"opencv_fuzzy",
"-l",
"opencv_hfs",
"-l",
"opencv_img_hash",
"-l",
"opencv_line_descriptor",
"-l",
"opencv_quality",
"-l",
"opencv_reg",
"-l",
"opencv_rgbd",
"-l",
"opencv_saliency",
"-l",
"opencv_sfm",
"-l",
"opencv_stereo",
"-l",
"opencv_structured_light",
"-l",
"opencv_phase_unwrapping",
"-l",
"opencv_superres",
"-l",
"opencv_optflow",
"-l",
"opencv_surface_matching",
"-l",
"opencv_tracking",
"-l",
"opencv_datasets",
"-l",
"opencv_text",
"-l",
"opencv_dnn",
"-l",
"opencv_plot",
"-l",
"opencv_videostab",
"-l",
"opencv_videoio",
"-l",
"opencv_xfeatures2d",
"-l",
"opencv_shape",
"-l",
"opencv_ml",
"-l",
"opencv_ximgproc",
"-l",
"opencv_video",
"-l",
"opencv_xobjdetect",
"-l",
"opencv_objdetect",
"-l",
"opencv_calib3d",
"-l",
"opencv_imgcodecs",
"-l",
"opencv_features2d",
"-l",
"opencv_flann",
"-l",
"opencv_xphoto",
"-l",
"opencv_photo",
"-l",
"opencv_imgproc",
"-l",
"opencv_core",
"-g"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
}
}
]
}
中间那特别长的一溜通过指令获得:
pkg-config --cflags --libs opencv4
得到如下结果:
值得注意的是,在arg[]里面有一句
"args": [
"${file}",
....
]
这个${file}能避免每次编译运行都要更改program名字的繁琐
settings.json
{
"python.pythonPath": "/Users/yunyi/opt/anaconda3/bin/python",
//settings.json
"code-runner.executorMap": {
"c": "cd $dir && make && ./$fileNameWithoutExt && make clean",
"cpp": "cd $dir && make && ./$fileNameWithoutExt && make clean"
},
"editor.renderWhitespace": "all",
"editor.renderLineHighlight": "all",
"editor.formatOnSave": true,
"code-runner.runInTerminal": true,
"code-runner.ignoreSelection": true,
"code-runner.enableAppInsights": false,
"C_Cpp.updateChannel": "Insiders",
"[makefile]": {
"editor.insertSpaces": true
},
"C_Cpp.default.includePath": [
"/usr/local/Cellar/opencv/4.2.0_1/include"
]
}
四、测试
代码:
#include <iostream>
#include <opencv4/opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
cout << "nihao" << endl;
Mat img = imread("/Users/yunyi/Desktop/timg.jpeg", IMREAD_GRAYSCALE);
imshow("imgIuput", img);
waitKey(0);
destroyAllWindows();
return 0;
}
输出:
如果发生头文件无法打开的情况,看一下你的包含路径includePath有没有错,以及刚才那一大溜有没有错