STASM-ASM无法在linux中运行

时间:2013-02-15 02:04:55

标签: linux gcc ubuntu opencv

我正在开发一个图像处理项目,我需要找到并标记一些面部属性(即:嘴,鼻子,眼睛等)。我正在尝试使用STASM-ASM算法(http://www.milbo.users.sonic.net/stasm/),我已经在Windows中的先前项目中使用了这种技术,我获得了非常好的结果。

尝试在Linux中使用此实用程序时出现问题,我按照作者提供的说明构建了对象.o文件。然后,我按照How to create a static library with g++?中的说明创建了一个静态库。然后,我将这个静态库链接到我的proyect并包含以下头文件:

// 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文件,并获得了相同的结果。此问题类似于Trying to get stasm to work on Ubuntu中处理的问题。但是,这个帖子仍然没有最终解决方案。我希望有人可以帮我解决这个问题,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

此外,如果我更改传递给函数的其中一个参数的格式,我会收到如下错误:

../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/TUTORIALS/LibraryArchives-StaticAndDynamic.html

我不明白问题所在。

最诚挚的问候,

路易斯

3 个答案:

答案 0 :(得分:0)

由于stasm_dll.hpp中的定义包含extern“C”,因此我认为您在程序中稍后包含stasm.h时必须执行相同的操作,例如:

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

这应该得到调用约定,C / C ++问题正确

答案 1 :(得分: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。

答案 2 :(得分: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

感谢所有回答这些问题的人,感谢他们的时间和善意的建议。