linux - Gall 和 Lempitsky 如何编译 opencv 霍夫森林实现

标签 linux opencv

我正在尝试编译为 opencv 编写的 Gall 和 Lempitsky 的 Hough 森林实现。

可以从他们的网站下载here [mirrors] .

看起来它在查找 opencv 时遇到了问题。我使用 sudo apt-get install libopencv-dev opencv-doc 在 ubuntu 上安装了 opencv 2.3.1(或 2.4.4 我不确定),我可以编译并运行 中的示例/usr/share/doc/opencv-doc/examples

我按如下方式更改了 make 文件路径:

# change paths if necessary
# INCLUDES = -I/usr/pack/opencv-1.0.0-dr/amd64-debian-linux4.0/include/opencv
# LIBS = -lcxcore -lcv -lcvaux -lhighgui -lml
# LIBDIRS = -L/usr/pack/opencv-1.0.0-dr/amd64-debian-linux4.0/lib

INCLUDES = -I/usr/include/opencv
LIBS = -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
LIBDIRS = -L/usr/lib

我在运行 make all 时得到的错误是:

g++ -c -I/usr/include/opencv CRForest-Detector.cpp -O3 -Wno-deprecated
CRForest-Detector.cpp: In function ‘void run_train()’:
CRForest-Detector.cpp:543:27: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
CRForest-Detector.cpp: In function ‘void run_detect()’:
CRForest-Detector.cpp:521:27: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
g++ -c -I/usr/include/opencv CRPatch.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv HoG.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv CRForestDetector.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv CRTree.cpp -O3 -Wno-deprecated
g++ -L/usr/lib -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 -o CRForest-Detector CRForest-Detector.o CRPatch.o HoG.o CRForestDetector.o CRTree.o -O3 -Wno-deprecated
CRForest-Detector.o: In function `detect(CRForestDetector&)':
CRForest-Detector.cpp:(.text+0x3340): undefined reference to `cvLoadImage'
CRForest-Detector.cpp:(.text+0x34a3): undefined reference to `cvCreateImage'
CRForest-Detector.cpp:(.text+0x357b): undefined reference to `cvCreateImage'
CRForest-Detector.cpp:(.text+0x35d9): undefined reference to `cvConvertScale'
CRForest-Detector.cpp:(.text+0x3620): undefined reference to `cvSaveImage'
CRForest-Detector.cpp:(.text+0x3634): undefined reference to `cvReleaseImage'
...

我需要更改什么才能让 g++ 看到必要的库?我如何检查是否安装了所需的库?


编辑:

这是 pkg-config --modversion opencv 的输出: 2.4.4

这是 /usr/lib$ ls | 的输出grep“opencv”

libopencv_calib3d.a
libopencv_calib3d.so
libopencv_calib3d.so.2.3
libopencv_calib3d.so.2.3.1
libopencv_contrib.a
libopencv_contrib.so
libopencv_contrib.so.2.3
libopencv_contrib.so.2.3.1
libopencv_core.a
libopencv_core.so
libopencv_core.so.2.3
libopencv_core.so.2.3.1
libopencv_features2d.a
libopencv_features2d.so
libopencv_features2d.so.2.3
libopencv_features2d.so.2.3.1
libopencv_flann.a
libopencv_flann.so
libopencv_flann.so.2.3
libopencv_flann.so.2.3.1
libopencv_gpu.a
libopencv_gpu.so
libopencv_gpu.so.2.3
libopencv_gpu.so.2.3.1
libopencv_highgui.a
libopencv_highgui.so
libopencv_highgui.so.2.3
libopencv_highgui.so.2.3.1
libopencv_imgproc.a
libopencv_imgproc.so
libopencv_imgproc.so.2.3
libopencv_imgproc.so.2.3.1
libopencv_legacy.a
libopencv_legacy.so
libopencv_legacy.so.2.3
libopencv_legacy.so.2.3.1
libopencv_ml.a
libopencv_ml.so
libopencv_ml.so.2.3
libopencv_ml.so.2.3.1
libopencv_objdetect.a
libopencv_objdetect.so
libopencv_objdetect.so.2.3
libopencv_objdetect.so.2.3.1
libopencv_video.a
libopencv_video.so
libopencv_video.so.2.3
libopencv_video.so.2.3.1

/usr/include/opencv$ ls | 的输出grep ''

cvaux.h
cvaux.hpp
cv.h
cv.hpp
cvwimage.h
cxcore.h
cxcore.hpp
cxeigen.hpp
cxmisc.h
highgui.h
ml.h

这里是我需要的所有文件还是我遗漏了什么?


编辑 2:

按照建议将我的包含和库更改为以下内容:

INCLUDES = -I/usr/include/opencv
LIBS = /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so /usr/lib/libopencv_imgproc.so
LIBDIRS = -L/usr/lib

结果如下:

user@user:~/Code/hough_forest$ make clean
rm -f *.o *~ CRForest-Detector
user@user:~/Code/hough_forest$ make all
g++ -c -I/usr/include/opencv CRForest-Detector.cpp -O3 -Wno-deprecated
CRForest-Detector.cpp: In function ‘void run_train()’:
CRForest-Detector.cpp:543:27: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
CRForest-Detector.cpp: In function ‘void run_detect()’:
CRForest-Detector.cpp:521:27: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result [-Wunused-result]
g++ -c -I/usr/include/opencv CRPatch.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv HoG.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv CRForestDetector.cpp -O3 -Wno-deprecated
g++ -c -I/usr/include/opencv CRTree.cpp -O3 -Wno-deprecated
g++ -L/usr/lib /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so /usr/lib/libopencv_imgproc.so -o CRForest-Detector CRForest-Detector.o CRPatch.o HoG.o CRForestDetector.o CRTree.o -O3 -Wno-deprecated
CRForest-Detector.o: In function `detect(CRForestDetector&)':
CRForest-Detector.cpp:(.text+0x3a87): undefined reference to `cvLoadImage'
CRForest-Detector.cpp:(.text+0x3b9e): undefined reference to `cvCreateImage'
CRForest-Detector.cpp:(.text+0x3c61): undefined reference to `cvCreateImage'
CRForest-Detector.cpp:(.text+0x3cae): undefined reference to `cvConvertScale'
CRForest-Detector.cpp:(.text+0x3d03): undefined reference to `cvSaveImage'
CRForest-Detector.cpp:(.text+0x3d12): undefined reference to `cvReleaseImage'
CRForest-Detector.cpp:(.text+0x3d39): undefined reference to `cvReleaseImage'
CRForest-Detector.cpp:(.text+0x3d67): undefined reference to `cvReleaseImage'
...

最佳答案

我设法使用以下路径进行编译:

INCLUDES = -I/usr/local/include/opencv
LIBS = /usr/local/lib/libopencv_core.dylib /usr/local/lib/libopencv_highgui.dylib /usr/local/lib/libopencv_imgproc.dylib
LIBDIRS = -L/usr/local/lib

请注意,我使用的是 OSX,而​​不是 Linux,但使用显式库文件的路径是可行的。请注意,在 osx 上编译的库是 .dylib 文件,而在 linux 上可能是 .so 或 .a 和 路径略有不同,因此您可能想尝试类似的方法:

INCLUDES = -I/usr/include/opencv
LIBS = /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so /usr/lib/libopencv_imgproc.so
LIBDIRS = -L/usr/lib

更新 我在虚拟机上安装了 Ubuntu 12 并从源代码编译了 OpenCV 2.4.4 并注意到了这一点:

  1. OpenCV 默认在 /usr/local/include 中安装头文件,在 /usr/local/lib 中安装库(就像在 OSX 上一样)
  2. 我遇到了您发布的确切错误。我没想到,因为我认为这些类是在核心库中定义的。

主要问题似乎是链接已编译库的顺序。我在 this question and answer 中找到了一些方便的细节.使用这些信息我更新了 makefile 的这一部分:

CRForest-Detector: $(OBJS)
        $(CC) $(LIBDIRS) $(LIBS) -o $@ $+ $(OPT)

像这样:

CRForest-Detector: $(OBJS)
        $(CC) -o $@ $+ $(OPT) `pkg-config opencv --cflags --libs`

这行得通,我已经设法在 Ubuntu/Linux 上编译。

好消息是:make all 成功了 坏消息是:我以前从未使用过 pkg-config,但它似乎很好地输出了正确的路径。即便如此,当我运行 ./CRForest-Detector 时,我在查找我不完全理解的 opencv 库时遇到错误。我猜你能找到一些有用的建议 herehere

结论:在 make 文件中使用 pkg-config 选项,因为这将是这个问题的解决方案(编译应用程序)。

关于linux - Gall 和 Lempitsky 如何编译 opencv 霍夫森林实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506518/

相关文章:

python - 在 Ubuntu 16 上安装 openCV 时如何在 cmake 中包含 libgtk2.0-dev 和 pkg-config

linux - ImageMagick/Perl 按像素宽度/高度对图像进行排序

linux - 如何将命令的一部分存储到变量中

python - 如何使用 Python 在 OpenCV 中裁剪图像

c++ - 14 段显示和 Tesseract OCR with OpenCV

c++ - 将 const float* 转换为 Mat

c++ - 找不到 opencv naclport 构建输出

linux - 用于替换换行符的 sed 命令在 solaris 中不起作用,但在 linux 中起作用

linux - 如何使用 CPack 惯用地打包 QT 应用程序的依赖项?

linux - Linux "st"实用程序中的 "top"参数是什么意思?