0

私は、いくつかの顔の属性(つまり、口、鼻、目など)を見つけてラベルを付ける必要がある、画像処理プロジェクトに取り組んでいます。私はSTASM-ASMアルゴリズム(http://www.milbo.users.sonic.net/stasm/)を使用しようとしていますが、Windowsで行われた以前のプロジェクトでこの手法をすでに使用しており、非常に良い結果が得られました。

Linuxでこのユーティリティを使用しようとすると、問題が発生します。作成者から提供された指示に従って、オブジェクト.oファイルを作成しました。次に、「g ++で静的ライブラリを作成する方法」の手順に従って静的ライブラリを作成しましたか?。次に、この静的ライブラリをプロジェクトにリンクし、次のヘッダーファイルをインクルードしました。

// stasm.h

#ifndef STASM_H_
#define STASM_H_
void AsmSearchDll(int *pnlandmarks, int landmarks[], const char image_name[], const char          image_data[], const int width, const int height, const int is_color, const char con f_file0[], const char conf_file1[]);

#endif 

このプロジェクトを構築しようとすると、次のエラーが発生します。

undefined reference to `AsmSearchDll(int*, int*, char const*, char const*, int, int, int, char const*, char const*)'

ヘッダーファイルが正しくインクルードされていると確信しているので、これは私には非常に奇妙に思えます。また、作成者がパッケージにインクルードした.hppファイルを試してみたところ、まったく同じ結果が得られました。この問題は、Ubuntuでstasmを動作させるための試行で扱われる問題と似ています。しかし、その投稿は最終的な解決策がないままです。誰かが私がこれを解決するのを手伝ってくれることを願っています。STASM-ASMユーティリティは本当に素晴らしいです、そしてそれが提供されているのでLinuxで使用できないのは残念です。

問題は型の不一致ではないと思います。ASMSearchDll関数の呼び出しとその宣言を分析した後、これを結論付けました。この関数は次のように呼び出されます。

AsmSearchDll(&nlandmarks, landmarks, image_name, img->imageData, img->width, img->height,1 /* is_color */, NULL /* conf_file0 */, NULL /* conf_file1 */);

また、関数の定義は次のとおりです。

// stasm_dll.hpp

#ifndef stasm_dll_hpp
#define stasm_dll_hpp

extern "C"
void AsmSearchDll(
int *pnlandmarks,          // out: number of landmarks, 0 if can't get landmarks
int landmarks[],           // out: the landmarks, caller must allocate
const char image_name[],   // in: used in internal error messages, if necessary
const char image_data[],   // in: image data, 3 bytes per pixel if is_color
const int width,           // in: the width of the image
const int height,          // in: the height of the image
const int is_color,        // in: 1 if RGB image, 0 for grayscale
const char conf_file0[],   // in: 1st config filename, NULL for default
const char conf_file1[]);  // in: 2nd config filename, NULL for default, "" if none
#endif // stasm_dll_hpp

さらに、関数に渡されるパラメーターの1つの形式を変更すると、次のようなエラーが発生します。

../src/PruebaStasm.cpp:44:155: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
../src/stasm_dll.hpp:6:6: error:   initializing argument 1 of ‘void AsmSearchDll(int*, int*, const char*, const char*, int, int, int, const char*, const char*)’ [-fpermissive]

提供されたmakefileを使用して.oファイルを再度コンパイルしました。これらの.oファイルは、このチュートリアルに従って共有およびダイナミックライブラリを作成しました:http ://www.yolinux.com/tokyoS/LibraryArchives-StaticAndDynamic.html

問題がどこにあるのかわかりません。

よろしくお願いします、

ルイス

4

3 に答える 3

0

stasm_dll.hppの定義はextern"C"でラップされているため、後でstasm.hをプログラムに含める場合は、次のように同じことを行う必要があると思います。

extern "C" {
 #include "stasm.h"
}

これにより、呼び出し規約、C /C++の問題が正しく発生するはずです。

于 2013-02-19T15:22:45.667 に答える
0

ここに示されているように:

http://www.milbo.users.sonic.net/stasm/minimal.html

呼び出す必要があります:

    SHAPE                               // results returned as a SHAPE
    AsmSearch(
      SHAPE &StartShape,              // out: start shape returned in here
      DET_PARAMS &DetParams,          // out: face detector parameters
      double &MeanTime,               // out: mean time per image (face det failed excluded)
      const RgbImage &RgbImg,         // in: find face features in this image
      const char sImage[],            // in: file path for RgbImg, for err msgs
      const bool fRowley=false,       // in: true to use VJ detector, else Rowley
      const char sConfFile0[]="../data/mu-68-1d.conf", // in: 1st config filename
      const char sConfFile1[]="../data/mu-76-2d.conf", // in: 2nd config filename
      const char sDataDir[]="../data",// in: data directory
      const char sShapeFile[]=NULL,   // in: if not NULL then use face detector in here
      bool fIssueWarnings=true);      // in: true to issue warnings if needed

LinuxでAsmSearchDllを呼び出すことができるかどうかはわかりません。

于 2013-02-25T21:32:17.093 に答える
0

コメントしたように、関数ASMSearchDLLはWindowsでのみ使用するように考えられているため、Linuxでは簡単に使用できません。

最後に、いくつかの小さな変更を加えて、Linuxで関数AsmSearchを使用することができました。この関数を使用するために、stasm-asmパッケージに含まれているソースファイルから取得した.oファイルを含む静的ライブラリを構築しました。

より正確には、makefileファイルに以下を追加しました。

LIB_OBJ=\
       stasmlibrary.o\
       $(STASM_OBJ)

lib: $(LIB_OBJ)
       ar rs libstasm.a $(LIB_OBJ)

stasmlibrary.cppとstasmlibrary.hppには、パッケージで提供されているAsmSearchに基づいて定義した関数が含まれています。STASM_OBJ変数には、次のオブジェクトファイルが含まれています。

stasm.o\
atface.o\
ezfont.o\
find.o\
follow.o\
forward.o\
imfile.o\
imwrite.o\
imgiven.o\
imshape.o\
imutil.o\
initnet.o\
jpegutil.o\
landmarks.o\
mat.o\
matvec.o\
mchol.o\
mrand.o\
prof.o\
readconf.o\
rgbimutil.o\
rowley.o\
rowleyhand.o\
search.o\
shapefile.o\
shapemodel.o\
sparsemat.o\
startshape.o\
safe_alloc.o\
tclHash.o\
util.o\
violajones.o\
vjhand.o\
wrbmp.o\
asmsearch.o\
initasm.o\
readasm.o\
err.o\
release.o\
tab.o

時間と親切な提案をしてくれたこの質問に答えてくれたすべての人に感謝します。

于 2013-02-27T15:14:02.507 に答える