如何在覆盆子上链接 OpenCV 的正确目录?
Posted
技术标签:
【中文标题】如何在覆盆子上链接 OpenCV 的正确目录?【英文标题】:How to link the correct directory for OpenCV on raspberry? 【发布时间】:2020-07-16 09:17:32 【问题描述】:我按照tutorial 将 openCV 安装到了我的树莓派上,但文件进入了目录:usr/local/include/opencv4/opencv2 而不是 usr/local/include/opencv2
现在编译失败,即使我使用#include
【问题讨论】:
我建议您按照本教程重新安装。 pyimagesearch.com/2019/09/16/… 我看到遵循相同的步骤,认为我需要使用 C++ 版本,尽管 python 工作正常但 C++ 代码失败。建造过程也需要一个多小时,值得吗? 这个命令在终端pkg-config --modversion opencv
或opencv4上的输出是什么
使用 opencv4 的输出是:4.2.0
你在控制台编译,对吧?如果是这样,您是否将代码与 OpenCV 的路径链接? (这是针对 C++ 的,因为正如您所说,它失败了)
【参考方案1】:
这有点令人困惑。在“旧”时代,OpenCV 将其目录默认放置在 /usr/local/inculde/opencv2 目录中。但是,随着自 OpenCV 4 以来的主要版本更改,当您在同一台机器上安装 OpenCV 2 和 4 时,它会产生很多潜在的冲突。为了克服这个问题,OpenCV 现在将头文件默认放置在 opencv4 文件夹中。
您现在可以选择您想要的版本(当然,如果您都安装了):#include /usr/local/include
将指向“旧”版本 2,或 #include /usr/local/include/opencv4
指向第 4 版。
大多数情况下,您不包括像 opencv.hpp 这样的单个头文件。 请看下面的sn-p代码。
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc,char ** argv)
VideoCapture cap(0);
if (!cap.isOpened())
cerr << "ERROR: Unable to open the camera" << endl;
return 0;
Mat frame;
cout << "Start grabbing, press a key on Live window to terminate" << endl;
while(1)
cap >> frame;
if (frame.empty())
cerr << "ERROR: Unable to grab from the camera" << endl;
break;
imshow("Live",frame);
int key = cv::waitKey(20);
key = (key==255) ? -1 : key;
if (key>=0) break;
cout << "Closing the camera" << endl;
cap.release();
destroyAllWindows();
return 0;
在编译期间,您只需提供一次位置。 这是 Code::Block 项目文件的一部分。使用的机制是明确的;只需提供一次您的中心位置。 此外,通过链接整个包,您不必将单个目标文件与令人沮丧的相互依赖关系链接起来。
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
<Add directory="/usr/local/include/opencv4" />
</Compiler>
<Linker>
<Add option="`pkg-config --libs --cflags opencv4`" />
</Linker>
我已经在GitHub 上放置了一些(深度学习)示例,介绍如何在 Raspberry Pi 上使用 OpenCV 4。在这里你会看到如何使用 C++ OpenCV。
【讨论】:
以上是关于如何在覆盆子上链接 OpenCV 的正确目录?的主要内容,如果未能解决你的问题,请参考以下文章