1

前回と同じような質問で、答えが見つかりませんでした。

私は重要だと考えていることに注意してください。通常、次のコマンドを使用して、opencvでプログラムをコンパイルします。

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

この行は、名前がdefで、使用できる実行可能ファイルを作成します。

私はプロジェクトで作業していますが、プロジェクトが大きくなるにつれて、すべてを簡単に処理できるようにするために、いくつかのオブジェクトを定義する必要がありました。私はファイルから1つのオブジェクトを作成します: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` 

今まではすべてが正常に機能しています。

次に、2番目のオブジェクト(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には、すべての典型的なインクルードと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は認識されません。

ありがとう

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 に答える