这里我和上一次有类似的问题,而我找不到任何答案。
请注意,我认为很重要:通常我使用下一个命令在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”行,(在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中,我有所有的tipical包括和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之外我还有所有相同的包含,而不是这个我有segator.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。我不会被承认。
由于
答案 0 :(得分:1)
您的包含标头保护错误。它们应该是唯一的,使用源文件的名称,而不仅仅是_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。你的标题很难与其他标题共存。
正如Jonathan Wakely指出的那样,用下划线开头的符号也不是一个好主意。