我一直在Vscode中尝试在我的M1芯片Mac上设置opencv,我使用了自制啤酒,并遵循了所有必要的步骤将其安装在我的Mac上。我创建了一个vscode项目,并将其包含在c_cpp_properties.json和task.json文件中。当我写一个简单的测试程序时,我用g++构建了这个程序,但构建失败并抛出了一个错误:
致命错误:找不到"opencv2/opencv.hpp"文件
我尝试了很多不同的方法来包括库,但#include<opencv2/opencv.hpp>在我的程序中,在构建程序之前没有。Intellisense为我提供了程序中的建议和一切。我浏览了关于堆栈溢出的几个现有问题,但没有一个对我有效的解决方案
我尝试了一系列不同的解决方案,这些解决方案是我在网上、论坛上和周围找到的,但似乎都不起作用以下是我的c_cpp_properties.json和task.json文件:Task.json:
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I",
"/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"/usr/local/include/opencv4"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "compiler: /usr/bin/g++"
}
]
}
c_cpp_properties.json:
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"/usr/local/include/opencv4"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
我的示例代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
///////////////// Images //////////////////////
int main() {
string path = "/Users/brettmylek/Desktop/OpenCV/Img/TestImg.jpg";
Mat img = imread(path);
imshow("Image", img);
waitKey(0);
return 0;
}
它只是打开一个映像来测试安装是否成功,这样我就可以继续开发我的实际项目了。
我将从c_cpp_properties.json
开始,更确切地说是includePath
元素。此元素仅适用于IntelliSense。它没有任何其他用途。这应该可以回答IntelliSense工作的原因。
如果你看看tasks.json
,有一件事引起了我的注意:
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
--> "-I",
--> "/Users/user/Desktop/OpenCV/opencv/include/opencv2",
--> "/usr/local/include/opencv4"
],
这很可能不会像你想象的那样奏效。你想要的是:
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"-I/usr/local/include/opencv4"
],
编辑:你可能必须链接到已构建的opencv库(上次我检查它不是一个只有头的库)
EDIT2:你也确定这个路径:/Users/user/Desktop/OpenCV/opencv/include/opencv2
">
上次我检查Linux上没有/Users
第三版:我检查了他们的github。如果错误持续存在,则很可能是错误的包含路径,即不是
"-I/Users/user/Desktop/OpenCV/opencv/include/opencv2"
也许它应该是(基于他们的github)这个:
"-I/Users/user/Desktop/OpenCV/opencv/include"
我也遇到过类似的问题,只是解决了它。作为参考,我通过自制程序安装了OpenCV,以及VSCode扩展C/C++
和C/C++ Extension Pack
(均由Microsoft编写)。我有一台Mac M1,以前一直在使用Xcode,所以可能已经安装了一些与编译器相关的东西。
无论如何,要检查OpenCV的安装路径,请尝试brew --prefix opencv
,它应该会给出类似/opt/homebrew/opt/opencv
的内容。
这个文件是自制软件Cellar的符号链接,所以如果你更改opencv的版本,这个文件引用将保持不变。(顺便说一句,您可以通过键入readlink -f $(brew --prefix opencv)
来查看磁盘上的实际位置,您应该会得到类似/opt/homebrew/Cellar/opencv/4.7.0_1
的内容)。
您需要引用的opencv2文件夹中包含头文件,它位于下面的两个目录中——对我来说,在撰写本文时,它位于/include/opencv4
中。
一个关键的时刻是Visual Studio设置文件.vscode/c_cpp_properties.json
文件完全由VSCode用于自动完成,所以我在其中添加了includePath/opt/homebrew/opt/opencv/include/opencv4
。
然后在tasks.json
文件中,我必须添加到"args"
部分:
"-I$(brew --prefix opencv)/include/opencv4",
"-L$(brew --prefix opencv)/lib",
"-lopencv_core",
"-lopencv_imgcodecs",
"-lopencv_highgui",
我确实从另一篇StackOverflow帖子中改编了这篇文章,所以感谢Jeffrey Yu。
只是为了解释一下,$(brew --prefix opencv)
在运行编译器的命令行中运行一个迷你脚本,因此您最终获得了brew文件夹的完整路径。
所以我的tasks.json文件看起来像这样:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-std=c++17",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-I$(brew --prefix opencv)/include/opencv4",
"-L$(brew --prefix opencv)/lib",
"-lopencv_core",
"-lopencv_imgcodecs",
"-lopencv_highgui",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
我的c_cpp_properties.json看起来是这样的:
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/opt/homebrew/opt/opencv/include/opencv4"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}
作为参考,我的测试程序如下:
// opencv-test.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using std::cout;
using std::endl;
using namespace cv;
int main(int argc, char** argv) {
Mat image = imread("my-image.jpg", IMREAD_UNCHANGED);
if (image.empty()) {
cout << "Not a valid image file" << endl;
return -1;
}
namedWindow("Simple Demo", WINDOW_AUTOSIZE);
imshow("Simple Demo", image);
waitKey(0);
destroyAllWindows();
return 0;
}
作为一种包括所有可用的OpenCV库的更为防弹的方法,您可以添加:,而不是上面的tasks.json调整
"`pkg-config --cflags --libs opencv4`",
这是因为pkg-config --cflags --libs opencv4
(在命令行中不带反勾号地尝试)会生成整个包所需的所有包含和链接信息。