正确包括在 opencv 2.3 中使用新的 C++ API

Posted

技术标签:

【中文标题】正确包括在 opencv 2.3 中使用新的 C++ API【英文标题】:Correct includes to use the new C++ API in opencv 2.3 【发布时间】:2012-04-07 12:46:51 【问题描述】:

对老的opencv 1比较熟悉,用了很久的C函数。但是,我在切换到 opencv 2.3 的 C++ API 时遇到问题

我下载了最新的稳定版(2.3.1),但里面的例子要么使用旧的 C 函数,要么包含"opencv2/highgui/highgui.hpp"

问题是,我的include/opencv2 目录中的唯一文件是opencv.hpp。如果我包括在内,则有很多不正确的路径。 在opencv.hpp里面有这样的东西:

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"

等等

但是,在我的 opencv 目录中,包含文件位于以下文件夹中:

modules/core/include/opencv2/core
modules/flann/include/opencv2/flann
modules/imgproc/include/opencv2/imgproc

等等。

那么,如果我必须为每个标头手动指定包含路径,那么 opencv.hpp 的意义何在?在 opencv 网站 (http://opencv.willowgarage.com) 上,教程要么已经过时,要么根本没有解决这个问题,而是直接跳到算法。

编辑:我正在使用 Qt,如果这很重要的话。我从http://code.opencv.org/svn/opencv/branches/2.3/下载了源码并构建成功。

Edit2:是的,这很重要。缺少一个 Qt 头文件,因此 opencv 的构建过程跳过了一些库。

【问题讨论】:

【参考方案1】:

我已经很久没有使用opencv 2.3.1了,但是到目前为止使用来自opencv的包含已经足够了

#include <opencv/cv.h>
#include <opencv/highgui.h>

【讨论】:

cv.h 包含以下内容:#include "opencv2/core/core_c.h" #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/imgproc/imgproc.hpp" 等,所以我仍然有同样的问题。您使用什么包含路径?您是否手动设置了 opencv2/... 的所有包含路径? @vsz 我猜opencv/cv.h 的重点是你不必担心个人包含的问题。如果你想更细粒度,那么你可以包括例如opencv/cxcore.h 等等。 问题是,当我包含 opencv/cv.h 时,我得到编译器错误,因为它找不到 "opencv2/core/core_c.h" 和所有其他人。 但是当你构建时,modules 部分会丢失,所有标题都应该以opencvopencv2 结尾。你关注this了吗? 你必须手动复制文件或者你需要的所有包含都在'opencv'和'opencv2'以外的地方是没有意义的,所以我认为必须有一些东西你的构建出了问题。【参考方案2】:

我最近开始学习 opencv (2.3),正如 juanchopanza 所提到的,这应该足够了。我正在使用 osx 并安装了 opencv 1.0,所以我机器上的基本程序如下所示:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()

    namedWindow("HelloCV2");
    imshow("image",imread("../HelloCV2/dolphin_1.jpg"));
    waitKey(5000);
    return 1;

确保您的路径设置正确。 目前我正在使用 Qt,所以 .pro 文件如下所示:

QT       += core

QT       -= gui

TARGET = HelloCV2
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

INCLUDEPATH += /opt/local/include/ #this is where the header files are on my machine
LIBS += /opt/local/lib/libopencv_core.2.3.1.dylib
LIBS += /opt/local/lib/libopencv_highgui.2.3.1.dylib

HTH

【讨论】:

顺便说一句,这两个包括似乎都在opencv/highgui.h 你的包含路径中有&lt;YOUR_OPENCV_DIR&gt;/include,所以你的#include &lt;opencv2/core/core.hpp&gt;实际上是#include &lt;YOUR_OPENCV_DIR&gt;/include/opencv2/core/core.hpp&gt;。我的问题是,在我的include/opencv2 目录中除了opencv.hpp 之外没有nothing。正如我在问题中所写的那样,所有其他标题都在它们单独的目录中。 @vsz 你用的是什么操作系统?如果您在文件系统上搜索丢失的头文件,它们是否会显示出来? @George Profenza:是的,他们出现了。请参阅我的问题的第二部分:modules/core/include/opencv2/coremodules/flann/include/opencv2/flann 等。 @George Profenza:在Windows下,就像C:\opencv\modules\core\include\opencv2\core\core.hpp【参考方案3】:

我想我找到了问题所在。我拥有的Qt源(4.6.3)在corelib/global中没有qconfig.h,所以当我构建opencv时,并没有创建所有库,也没有复制头文件。

只是为了让其他有同样问题的人知道它,而不是浪费时间寻找解决方案:qtconfig.h 不包含在 Qt 源代码分发中。您必须自己创建该文件,其目录中有许多模板,或者重命名其中一个(qconfig-largeqconfig-minimal 等),或者只创建一个空的qconfig.h

编辑:我不向任何人推荐这种方式。我下载创建了一个mingw make,重新下载了所有内容,它现在可以工作了。我必须注意我构建的 opencv 的 mingw 版本与使用 Qt 的版本相同。

【讨论】:

【参考方案4】:

诀窍是构建“安装”项目。这会将所有标题等收集到一个目录中,并将启用示例显示的包含结构。

# create a build-directory, run cmake etc.
make
make install

【讨论】:

为了它是一个好的答案,请添加一些代码或示例,这种类型的答案实际上应该是一个评论

以上是关于正确包括在 opencv 2.3 中使用新的 C++ API的主要内容,如果未能解决你的问题,请参考以下文章

发现凸缺陷?在 OpenCV 2.3 中,c++ 与 MS Visual Studio 2010

C++ OpenCV 2.3 中缺少 MoveWindow()

OpenCv 2.3 C - 如何隔离图像内的对象

无法找到:“CL.exe”,Opencv与Visual Studio c ++ 2010快速程序错误

使用Python,OpenCV进行平滑和模糊

为 Windows 选择正确的 OpenCV 构建