这是我上次遇到的类似问题,但我找不到任何答案。

请注意,我认为很重要:通常,我使用以下命令在opencv中编译程序:

g++ -o def program.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

这行代码将创建一个可执行文件,其名称将为def并且可以使用。

我在一个项目中工作,而且随着它变得越来越大,我不得不定义一些对象,以使所有事情都变得更容易并可能处理。我从文件中创建一个对象:homogra.cpp和homogra.h我使用的命令是:
g++ -c  homogra.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

然后,我在program.cpp中写了#include“homogra.h”行

我像这样编译:
 g++ -o def program.cpp homogra.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

到目前为止,一切正常。

然后,我创建第二个对象(具有与homogra相同的编译行,但是这次是使用segmentator.cpp和segmentator.h),我在program.cpp中编写了行#include“segmentator.h”,然后进行编译喜欢:
g++ -o def program.cpp .o segmentator.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

现在,它不起作用,也无法识别细分器。我已经检查了细分器是否在工作,并且如果homogra是program.cpp中的唯一内容,那么一切正常。

我注意到一些奇怪的事情。如果我更改了这些行并且之前在#include行中编写了#include“segmentator.h”,然后#include“homogra.h”,则编译器将使用同一行进行编译:
 g++ -o def program.cpp homogra.o segmentator.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

仅识别此时间分割符,而不识别同构。可能有点难以理解,我试图尽可能地解释它。

任何帮助!?

提前谢谢了。

这是homogra.h:
using namespace cv;
using namespace std;

#ifndef _NAMES_H
#define _NAMES_H
class homogra {
public:

    Mat matCalculation( Mat img, Mat img2);
    void printMatrix(Mat matrix);

};
#endif

在homogra.cpp中,我拥有所有常用的include和homogra.h:
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <sstream>
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "homogra.h"

然后说明功能。

对象2是segmentator.h
 using namespace cv;
 using namespace std;

#ifndef _NAMES_H
#define _NAMES_H
 class segmentator {
public:

    void search(Mat img,vector<std::vector<cv::Point> >& contours);

     void similar(vector<std::vector<cv::Point> >& contours,vector<std::vector<cv::Point> >& contours2,vector<int>& idx);

    vector<Mat> separate(Mat img,Mat img2,vector<std::vector<cv::Point> >&   contours,vector<std::vector<cv::Point> >& contours2,vector<int> idx);
};

#endif

在segmentator.cpp中,我再次具有所有相同的内容,但homogra.h除外,而不是我有segmentator.h。

Program.cpp是image_reg.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include "homogra.h"
#include "segmentator.h"
 using namespace cv;
 using namespace std;

int main(int argc, char ** argv )
{ //Here is the code where I try to invoque two instances of homogra and segmentator.
}

如果在image_reg.cpp的包含列表中首先读取homogra.h,则仅识别homogra.h;如果在第一个位置分割器允许,则将仅创建segmentator.h实例并显示homogra。 h将不会被识别。

谢谢

最佳答案

您的include header 保护符是错误的。它们应该是唯一的,使用源文件的名称,而不仅仅是_NAMES_H

因此,在homogra.h中,您应该具有以下内容:

#ifndef HOMOGRA_H
#define HOMOGRA_H
...
#endif

...在segmentator.h中,您应该有这个
#ifndef SEGMENTATOR_H
#define SEGMENTATOR_H
...
#endif

另外,在头文件中包含using namespace xxx;也是really bad practice。您的 header 很难与其他人共存。

正如乔纳森·韦克利(Jonathan Wakely)所指出的那样,以下划线开头的符号也不是一个好主意。

10-04 15:04