opencv.hpp

转载自:https://www.cnblogs.com/yuanjiangw/p/9849143.html
对opencv.hpp头文件的认识

OpenCV学习笔记(二):对opencv.hpp头文件的认识 - 安东的技术博客 - 优快云博客 https://blog.youkuaiyun.com/xidiancoder/article/details/50865351

1.opencv.hpp位置

该头文件位于*\opencv\sources\include\opencv2

比如下面就是该文件在我的机器上位置:
D:\opencv2.4.10\opencv\sources\include\opencv2\opencv.hpp

2.opencv.hpp内容

通常在查看opencv库文件时,转到定义(F12),我们会发现库文件开头都会声明

#include “opencv2/core/version.hpp”

#ifndef OPENCV_ALL_HPP
#define OPENCV_ALL_HPP

#include “opencv2/core/core_c.h”
#include “opencv2/core/core.hpp”
#include “opencv2/flann/miniflann.hpp”
#include “opencv2/imgproc/imgproc_c.h”
#include “opencv2/imgproc/imgproc.hpp”
#include “opencv2/photo/photo.hpp”
#include “opencv2/video/video.hpp”
#include “opencv2/features2d/features2d.hpp”
#include “opencv2/objdetect/objdetect.hpp”
#include “opencv2/calib3d/calib3d.hpp”
#include “opencv2/ml/ml.hpp”
#include “opencv2/highgui/highgui_c.h”
#include “opencv2/highgui/highgui.hpp”
#include “opencv2/contrib/contrib.hpp”

#endif

如果仔细观察,我们就可以看到,在该头文件中已经包含了OpenCV中各个模块的头文件,换句话说我们在一般情况下,只需要引用

#include<opencv2/opencv.hpp>

可以显著的简化代码。

c++中的.hpp文件-vivieu-ChinaUnix博客 http://blog.chinaunix.net/uid-24118190-id-75239.html

2010-08-07 17:13:44

c++中的.hpp文件

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该cpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。

1、是Header Plus Plus 的简写。

2、与*.h类似,hpp是C++程序头文件 。

3、是VCL 专用的头文件,已预编译。

4、是一般模板类的头文件。

5、一般来说,.h里面只有声明,没有实现,而.hpp里声明实现都有,后者可以减 少.cpp的数量。

6、.h里面可以有using namespace std,而.hpp里则无。

7、*.hpp要注意的问题有:

  a)不可包含全局对象和全局函数

 由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。

  b)类之间不可循环调用

  在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:



class B;
 class A{
 public:
 void someMethod(B b);
 };
 class B{
 public:
 void someMethod(A a);
 };

在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的hpp文件中,形如以下的循环调用也将导致编译错误:

 //a.hpp

 #include "b.hpp"
 class A{
 public:
 void someMethod(B b);
 };
 //b.hpp

 #include "a.hpp"
 class B{
 public:
 void someMethod(A a);
 }

c)不可使用静态成员

  静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯 一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:



 class A{
 public:
 const static int intValue = 123;
 };

由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)

一、类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟

//方法模拟获取静态成员

 someType getMember()
 {
 static someType value(xxx);//作用域内静态变量

 return value;
 }

二、.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。

someType getMemberA()
 {
 static someType value(xxx);//作用域内静态变量

 return value;
 }
 someType getMemberB()
 {
 static someType value(xxx);//作用域内静态变量

 return value;
 }
 void accessMemberA()
 {
 someType member = getMemberA();//获取静态成员

 };
 //获取两个静态成员

 void accessStaticMember()
 {
 someType a = getMemberA();//获取静态成员

 someType b = getMemberB();
 };

三、第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常巨大,在此种情况下,建议使用Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为全局唯一的对象进行调用。

 如原h+cpp下的定义如下:

class A{
 public:
 type getMember(){
 return member;
 }
 static type member;//静态成员

 }

采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)

//实际实现类

 class Aprovider{
 public:
 type getMember(){
 return member;
 }
 type member;//变为普通成员

 }
 //提供给调用者的接口类

 class A{
 public:
 type getMember(){
 return Singleton<AProvider>::getInstance()->getMember();
 }
 }
<think>嗯,用户想获取opencv.hpp的代码或者下载OpenCV的头文件。首先,我需要回忆一下OpenCV的结构。opencv2/opencv.hpp这个文件其实是包含所有其他模块头文件的主头文件,方便用户一次性引入所有功能。但是用户可能遇到了编译错误,比如找不到这个文件,这可能和安装方式有关。 根据用户提供的引用内容,特别是引用[2],里面提到opencv.hpp包含了各个模块的头文件,比如core、imgproc等。所以这个文件本身可能只是一个汇总,里面用#include把各个模块的头文件包含进去。用户可能需要确认他们的OpenCV是否正确安装,以及头文件路径是否被正确包含到项目中。 用户可能的问题是在编译时找不到opencv.hpp,这时候需要检查CMake配置是否正确。比如引用[3]中提到,使用find_package(OpenCV REQUIRED)和include_directories来设置头文件路径。可能需要指导用户如何正确配置CMakeLists.txt,确保路径正确。 另外,用户可能误解了opencv.hpp的内容,以为它是一个独立的文件,需要查看其代码。但实际上,这个文件可能只是简单地包含其他头文件,所以直接查看安装目录下的该文件内容会更直接。比如在Ubuntu中,路径可能是/usr/include/opencv4/opencv2/opencv.hpp,或者在Windows的安装目录下。 用户可能需要下载OpenCV的头文件,这通常通过官方渠道安装OpenCV库即可获得。建议用户从官网下载或使用包管理器安装,确保头文件正确安装。如果已经安装但路径不对,可能需要调整编译器的包含路径或者CMake的配置。 总结下来,回答应该分步骤:解释opencv.hpp的作用,说明如何获取(安装OpenCV),如何查看内容,以及解决编译时找不到头文件的问题。同时,根据用户提供的引用,指出常见的配置错误和解决方法,比如正确使用CMake的find_package和include_directories。</think>### 如何获取`opencv.hpp`文件内容或下载OpenCV头文件? #### 1. **`opencv.hpp`的作用与内容** `opencv.hpp`是OpenCV的“总头文件”,其核心作用是**包含所有OpenCV模块的头文件**,简化开发者的引入操作。通过引用[^2],其内部代码类似以下结构(以OpenCV 4.x为例): ```cpp #include "opencv2/core/core_c.h" #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/imgproc/imgproc.hpp" // 其他模块的头文件... ``` 这意味着直接包含`#include <opencv2/opencv.hpp>`即可使用OpenCV的大部分功能。 #### 2. **如何获取`opencv.hpp`文件** `opencv.hpp`是OpenCV库的一部分,需通过以下方式获取: - **方式1:安装OpenCV库** - **Linux(Ubuntu)**: ```bash sudo apt-get install libopencv-dev ``` 安装后头文件默认位于`/usr/include/opencv4/opencv2/opencv.hpp`。 - **Windows/Mac**: 从[OpenCV官网](https://opencv.org/releases/)下载预编译包,解压后头文件在`opencv/build/include/opencv2`目录中。 - **方式2:源码编译** 若需自定义模块,可下载OpenCV源码并编译: ```bash git clone https://github.com/opencv/opencv.git cd opencv && mkdir build && cd build cmake .. && make -j4 ``` 编译后头文件生成在`build/include/opencv2`目录。 #### 3. **编译时找不到头文件的解决方法** 若出现`fatal error: opencv2/opencv.hpp: No such file or directory`,需检查**CMake配置**: ```cmake # 关键配置步骤 find_package(OpenCV REQUIRED) # 必须调用find_package include_directories(${OpenCV_INCLUDE_DIRS}) # 包含头文件路径 target_link_libraries(your_target ${OpenCV_LIBS}) # 链接库 ``` 通过引用[^3],若OpenCV安装路径非默认(如自定义安装到`/opt/opencv`),需在CMake中指定路径: ```cmake set(OpenCV_DIR "/opt/opencv/share/OpenCV") # 指向包含OpenCVConfig.cmake的目录 find_package(OpenCV REQUIRED) ``` #### 4. **验证头文件路径** 在终端中运行以下命令,确认头文件位置: ```bash # Linux find /usr -name "opencv.hpp" # Windows(假设安装到C盘) dir /s C:\opencv\build\include\opencv2\opencv.hpp ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值