2013-03-19 58 views
0

我正在嘗試爲opencv編寫Gall和Lempitsky的Hough森林實現。如何通過Gall和Lempitsky編譯opencv Hough森林實現

它可以從他們的網站here[mirrors]下載。

看起來它有問題找到opencv。我安裝使用sudo apt-get install libopencv-dev opencv-doc OpenCV的2.3.1(或2.4.4我不知道)在Ubuntu,我可以編譯和/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 

導致下面的輸出:

[email protected]:~/Code/hough_forest$ make clean 
rm -f *.o *~ CRForest-Detector 
[email protected]:~/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' 
... 

回答

1

我已經manged用以下路徑編譯:

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或u和 路徑略有不同,所以你可能想嘗試這樣的:

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 

UPDATE 我已經在虛擬機上安裝了Ubuntu 12並編譯了OpenCV 2.4。4從源代碼,並注意到這一點:在/usr/local/include

  1. 安裝OpenCV的頭文件和庫在/usr/local/lib默認情況下(在OSX等)
  2. 我跑進了確切的錯誤,因爲你發佈。我沒有想到,因爲我通過核心庫定義了這些類。

主要問題似乎是編譯庫鏈接的順序。我在this question and answer中發現了一些便利的細節。使用我已經更新了生成文件的這部分信息:

CRForest-Detector: $(OBJS) 
     $(CC) $(LIBDIRS) $(LIBS) -o [email protected] $+ $(OPT) 

像這樣:

CRForest-Detector: $(OBJS) 
     $(CC) -o [email protected] $+ $(OPT) `pkg-config opencv --cflags --libs` 

這工作,我已經成功地編譯在Ubuntu/Linux操作系統。

好消息是:make all工作 壞消息是:我從來沒有使用pkg-config,但它似乎很好地輸出正確的路徑。即便如此,當我運行./CRForest-Detector時,發現一個錯誤,發現我不完全瞭解的opencv庫。我猜你可以找到一些有用的建議herehere

結論:使用pkg-config選項,在make文件,因爲這將是解決這一問題(編譯應用程序)。

+0

嗯,我試過.so和.a文件,仍然不想去。我編輯我的問題與我有的opencv文件的輸出。它看起來像我擁有我需要的一切嗎?謝謝。 – waspinator 2013-03-20 01:34:59

+1

'LS的/ usr /本地/包含/ opencv'輸出'cv.h \t \t \t cvaux.hpp cxcore.hpp \t highgui.h cv.hpp \t \t \t cvwimage.h cxeigen.hpp \t ml.h cvaux。 h \t \t cxcore.h \t cxmisc.h '這一切都很好。 'LIBS = /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so/usr/lib/libopencv_imgproc.so'應該可以工作。請注意,它是完整的絕對路徑,我不使用'-l'。我認爲核心會有Mat/IplImage /等。類型,像imread/imwrite/imshow /等highui實用程序。和imgproc掩蔽和其他常見的過濾器。錯誤是否改變了?另外.... – 2013-03-20 11:54:52

+1

...我不確定它是否會有所作爲,但我注意到大多數錯誤來自:'cvLoadImage'等,我認爲它可能在覈心庫中。你可以嘗試首先鏈接到libopencv_core.so? (您的原始鏈接列表('-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')開始與calib3d,所以我假定你抓着他們全部按字母順序排列。)HTH – 2013-03-20 11:56:33

0

我一直在努力在Ubuntu機器上運行CRFOREST7個月。下面是一些建議:

的Makefile文件:

CRForest-Detector: $(OBJS) 
        $(CC) $(LIBDIRS) -o [email protected] $+$(OPT) $(LIBS) 

注:請把$(LIBS)結尾,否則,我會建議你重新安裝下一個適當的在Ubuntu軟件包的OpenCV配置指南。