1

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

请注意,我认为很重要:通常我使用下一个命令在 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),我写了#include "segmentator.h",(in program.cpp) 行并编译喜欢:

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 我有所有典型的包括和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.
}

如果我让 homogra.h 作为第一个在 image_reg.cpp 的包含列表中被读取,那么只有 homogra.h 被识别,如果我让在第一个位置分段器,那么只有 segmentator.h 实例将被创建和homogra。h 不会被识别。

谢谢

4

1 回答 1

1

您的包含标头保护是错误的。它们应该是唯一的,使用源文件的名称,而不仅仅是_NAMES_H.

所以在 homogra.h 你应该有这个:

#ifndef HOMOGRA_H  
#define HOMOGRA_H   
...
#endif

...在segmentator.h中,你应该有这个

#ifndef SEGMENTATOR_H  
#define SEGMENTATOR_H   
...
#endif

此外,在头文件中有一个非常糟糕的做法。using namespace xxx;您使您的标头很难与其他标头共存。

正如 Jonathan Wakely 指出的那样,以下划线开头的符号也不是一个好主意。

于 2012-05-31T09:20:40.317 回答