正确包括在 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
部分会丢失,所有标题都应该以opencv
和opencv2
结尾。你关注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
你的包含路径中有<YOUR_OPENCV_DIR>/include
,所以你的#include <opencv2/core/core.hpp>
实际上是#include <YOUR_OPENCV_DIR>/include/opencv2/core/core.hpp>
。我的问题是,在我的include/opencv2
目录中除了opencv.hpp
之外没有nothing。正如我在问题中所写的那样,所有其他标题都在它们单独的目录中。
@vsz 你用的是什么操作系统?如果您在文件系统上搜索丢失的头文件,它们是否会显示出来?
@George Profenza:是的,他们出现了。请参阅我的问题的第二部分:modules/core/include/opencv2/core
、modules/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-large
、qconfig-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()