【问题标题】:OpenCV compile Eigenface.cpp in Linux with using CodeBlocksOpenCV 使用 CodeBlocks 在 Linux 中编译 Eigenface.cpp
【发布时间】:2013-04-04 01:23:36
【问题描述】:

我想用 CodeBlocks 或 Linux 终端编译以下 OpenCV 程序。

http://plaza.ufl.edu/tyler727/imdl/src/eigenface.cpp

    line 57:   nTrainFaces = loadFaceImgArray("/home/hacker/data/Eigenfacecpp/train.txt");

    line 192: // load test images and ground truth for person number
             nTestFaces = loadFaceImgArray("/home/hacker/data/Eigenfacecpp/test.txt");

    // project the training images onto the PCA subspace
    projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1);
    for(i=0; i<nTrainFaces; i++)
    {
        cvEigenDecomposite(faceImgArr[i],
                           nEigens,
                           eigenVectArr,
                           0, 0,
                           pAvgTrainImg,
line 78:                    projectedTrainFaceMat->data.fl + i*nEigens);
    }

     cvCalcEigenObjects(nTrainFaces,
                        (void*)faceImgArr,
                        (void*)eigenVectArr,
                        CV_EIGOBJ_NO_CALLBACK,
                        0,
                        0,
                        &calcLimit,
                        pAvgTrainImg,
line 154:                eigenValMat->data.fl);

        //project the test image onto the PCA subspace
        cvEigenDecomposite(faceImgArr[i],
                           nEigens,
                           eigenVectArr,
                           0, 0,
                           pAvgTrainImg,
line 211:                   projectedTestFace);

我得到了这些错误:

Compiling: eigenface.cpp

In Function »void learn()«:
line 57:  deprecated conversion from string constant to ‘char*’ [Wwrite-strings]

In Function »double recognize()«:
line 192: deprecated conversion from string constant to ‘char*’ [Wwrite-strings]

/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
obj/Debug/eigenface.o: In function `learn()':
/home/hacker/data/Eigenfacecpp/eigenface.cpp:78: undefined reference to `cvEigenDecomposite'

obj/Debug/eigenface.o: In function `doPCA()':
/home/hacker/data/Eigenfacecpp/eigenface.cpp:154: undefined reference to `cvCalcEigenObjects'

obj/Debug/eigenface.o: In function `recognize()':
/home/hacker/data/Eigenfacecpp/eigenface.cpp:211: undefined reference to `cvEigenDecomposite'

我不明白我做错了什么。我认为这很愚蠢,但我找不到。

来自 CodeBlocks 的编译器和调试器设置:

链接器设置->其他选项:-lopencv_core -lopencv_objdetect -lopencv_imgproc -lopencv_highgui

搜索目录->编译器:/usr/local/include/opencv 搜索目录->链接器:/usr/lib

我在这里做错了什么? 请帮我解决这个问题。

【问题讨论】:

  • main 定义在哪里?在另一个文件中?是的。那么这不应该涉及链接。您只需编译这个-c,然后稍后链接对象.o 文件。

标签: c++ linux opencv compiler-errors codeblocks


【解决方案1】:

查看来自http://plaza.ufl.edu/tyler727/imdl/Lovelly_FCRAR12.pdf的参考文献[3]和[4]

【讨论】:

    【解决方案2】:

    找到 /usr/lib -name 'libopencv*.so' | xargs readelf -s | egrep "FUNCTION_NAME|libop" 查找 /usr/lib -name 'libopencv*.so' | xargs readelf -s | egrep "cvEigenDecomposite|libop"

    文件:./libopencv_legacy.so 680: 00000000000936f0 1046 FUNC 全局默认值 11 cvEigenDecomposite 所以与“libopencv_legacy.so”链接
    -lopencv_legacy

    【讨论】:

      【解决方案3】:
      1. 您的源代码不包含main() 函数,因此请从http://plaza.ufl.edu/tyler727/imdl/src/main.cpp 下载main.cpp 文件并将其放在您的项目目录中,或者取消注释eigenface.cpp 中的main(),或者甚至编写您自己的@ 987654325@函数。
      2. 使用 opencv 的链接器选项的完整列表是:-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_ts -lopencv_video -lopencv_videostab 当然,您可能不需要所有这些库,但不会有什么坏处,因为链接器足够智能,并且只会包含您实际引用的库.
      3. 您可以从命令行发出g++ main.cpp eigenface.cpp -o eigenface -I/usr/include/opencv -L/usr/lib &lt;all linker flags in "2"&gt;/usr/inlude/opencv 替换为包含OpenCV 头文件的目录,将/usr/lib 替换为包含所有库文件的目录。如果您使用发行版的包管理器(例如 apt-get 或 yum)来安装 OpenCV,这些可能是默认位置。

      【讨论】:

      • Kamyar 你也能回答我吗?编译错误不推荐使用从字符串常量转换:在函数»void learn()«:第 57 行:不推荐使用从字符串常量到 'char* 的转换' [Wwrite-strings] 在函数 »double identify()« 中:第 192 行:不推荐将字符串常量转换为 'char*' [Wwrite-strings]
      • 不客气@NacarAdrianls!对不起,因为我离开了几天,所以耽搁了。如果警告的来源来自 OpenCV(或其他地方)的(可能是旧的)头文件,这些头文件不受您的控制,那么您可以添加以下编译器 #pragma 来告诉 GCC 不要使用这种特定类型的警告来打扰您:@ 987654331@。将#pragma 放在代码的开头和任何有问题的标头的#include 之前。
      • 没问题。我按你说的做 编译器忽略它但我在终端中有错误提示: void printUsage() { printf("Usage: eigenface \n", " Valid commands are\n" " train\n" "测试\n");我认为程序无法加载训练和测试文件...
      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2012-07-16
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多