2013-11-04 21 views
5

Tôi quan tâm trong việc sử dụng Kota Yamaguchi's mexopencv library trên hệ thống của tôi với các đặc điểm sau:Biên soạn mexopencv trong OS X 10.9 với Xcode 5 và Matlab R2013b

  • OS X 10.9 (Mavericks)
  • Xcode 5
  • Matlab 2013b
  • OpenCV được cài đặt thông qua macports đến/opt/local/include/{opencv, opencv2} và/opt/local/lib

tôi git nhân bản bản sửa đổi OpenCV mới nhất bằng cách sử dụng lệnh trên trang web mexopencv; đây là phiên bản 084838d62a25fcb3eec9f610abf91b167bc6c2f5 từ Sat Jul 20 05:18:37 2013 -0700.

Tôi đã chạy lệnh của Matlab mex -setup và sau đó triển khai this workaround từ Mathworks để sử dụng Xcode 5 làm trình biên dịch mex của tôi.

tôi đã thêm lệnh pkg-config macports' để con đường với lệnh Matlab setenv('PATH', [getenv('PATH') ':/opt/local/bin']);

Bây giờ, chạy mxopencv.make mang lại được thông báo lỗi mối liên kết sau đây:

Undefined symbols for architecture x86_64: 
    "cv::merge(std::vector<cv::Mat, std::allocator<cv::Mat> > const&, cv::_OutputArray const&)", referenced from: 
     MxArray::toMat(int, bool) const in libMxArray.a(MxArray.o) 
    "cv::split(cv::Mat const&, std::vector<cv::Mat, std::allocator<cv::Mat> >&)", referenced from: 
     MxArray::MxArray(cv::Mat const&, mxClassID, bool) in libMxArray.a(MxArray.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

    mex: link of ' "+cv/CamShift.mexmaci64"' failed. 

make: *** [+cv/CamShift.mexmaci64] Error 255 

Tôi không chắc chắn những gì để làm vào thời điểm này. Có thể xây dựng mexopencv trên hệ thống của tôi không?

+0

Không có gì trong tài liệu dành cho Mac. Nhưng nếu thực hiện đi đến CamShift, Nó có nghĩa là bạn có thể biên dịch tất cả các tập tin khác trước? Bạn đã cố gắng loại bỏ CamShift.cpp chưa? – Vuwox

+0

Hãy xem [this] (http://stackoverflow.com/questions/16078512/undefined-symbols-for-architecture-x86-64-error-when-linking-opencv-in-xcode) – Vuwox

+0

@AlexandreBizeau, nếu Tôi loại bỏ CamShift, tôi chỉ nhận được thông báo lỗi tương tự trên tập tin tiếp theo, đó là Canny. Bài viết khác mà bạn đề cập đến là xây dựng OpenCV trong Xcode, không phải để sử dụng lệnh mex của Matlab để xây dựng mexopencv. –

Trả lời

7

Cuối cùng tôi đã tìm ra được vấn đề của mình, giải pháp dẫn đến các vấn đề khác, mà cuối cùng tôi đã có thể giải quyết được. Vì vậy, đây là một bước hoàn thành thủ tục của những gì tôi đã làm để có được mexopencv làm việc trên hệ thống của tôi (một số bước sẽ được lặp đi lặp lại từ câu hỏi ban đầu của tôi).

  1. Nhận mexopencv từ http://www.cs.sunysb.edu/~kyamagu/mexopencv/
  2. Thực hiện Mathworks workaround để có được những mex biên dịch Matlab làm việc với Xcode 5
  3. Run mex -setup từ bên trong Matlab
  4. Sửa đổi mới tạo ~/.matlab/R2013b/Tệp mexopts.sh như sau:

    1. Thay thế tất cả các tham chiếu của "-lstdC++" bằng "-lC++"
    2. Thêm các đối số sau vào biến CXXFLAGS: "-std = gnu ++ 11 -stdlib = libC++". Hai bước này đảm bảo rằng bạn đang sử dụng C++ 11 thay vì C++ 98 (nhờ this stack overflow post).
    3. Bạn nên đã thay thế tất cả các đoạn văn bản "10,7" với "10,8" từ một bước trước
    4. Thay đổi dòng

    MLIBS="-L$TMW_ROOT/bin/$Arch -lmx -lmex -lmat"

    để

    MLIBS="$TMW_ROOT/bin/$Arch/libmx.dylib $TMW_ROOT/bin/$Arch/libmex.dylib $TMW_ROOT/bin/$Arch/libmat.dylib" 
    

    này đảm bảo rằng trình biên dịch không tìm kiếm thư viện OpenCV theo số $TMW_ROOT/bin/$Arch trong đó, trên hệ thống của tôi, đánh giá là /Applications/MATLAB_R2013b.app/bin/maci64. Vì lý do gì, thư viện từ một phiên bản cũ của OpenCV (2.4.2) đi kèm với Matlab và sống trong thư mục đó (có thể chúng đi kèm với Hộp công cụ Hệ thống Tầm nhìn Máy tính).[Note: bước này có thể không cần thiết]

  5. Tạo một thư mục /Applications/MATLAB_R2013b.app/bin/maci64/libopencv và di chuyển tất cả các tập tin từ libopencv*.dylib/Applications/MATLAB_R2013b.app/bin/maci64 vào thư mục đó. Điều này ngăn cản trình liên kết tìm kiếm và vô tình liên kết đến phiên bản OpenCV cũ hơn này.
  6. Thêm lệnh pkg-config của macports vào đường dẫn Matlab bằng lệnh Matlab setenv('PATH', [getenv('PATH') ':/opt/local/bin']); Để tránh nhập lệnh này mỗi lần bạn khởi động Matlab, bạn có thể thêm mã này vào tệp startup.m của mình. Cuộc sống của tôi ở số ~/Documents/MATLAB/startup.m.
  7. Đảm bảo rằng bạn chạy mexopencv.make('clean', true); trong Matlab để xóa mọi lần thử không thành công trước khi biên dịch mexopencv
  8. Chạy mexopencv.make trong Matlab; nó sẽ hoạt động đúng (với một số cảnh báo) và trong năm phút hoặc lâu hơn, bạn sẽ có một phiên bản OpenCV được biên dịch MEX; Xin chúc mừng! Nhưng bạn chưa làm xong.

tôi đã cố gắng ra cài đặt của tôi về OpenCV với một bài kiểm tra một lót đơn giản:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

Khi tôi cố gắng chạy nó vào thời điểm này, tôi nhận được thông báo lỗi sau:

>> imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])); 
Error using cv.Canny 
Invalid MEX-file '/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64': dlopen(/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64, 6): Library not loaded: 
/opt/local/lib/libtiff.5.dylib 
    Referenced from: /opt/local/lib/libopencv_highgui.2.4.dylib 
    Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 8.0.0 or later, but libtiff.5.dylib provides version 6.0.0 

Vấn đề là Matlab có phiên bản riêng của một số thư viện cài đặt macports, chứa trong /Applications/MATLAB_R2013b.app/bin/maci64, khác với các phiên bản /opt/local/lib. Theo mặc định, Matlab cố gắng tự động liên kết các phiên bản riêng của các thư viện, đó không phải là các phiên bản mà OpenCV mong đợi, do đó chương trình không chạy.

Giải pháp được đề xuất trong tệp README.markdown được bao gồm với mexopencv. Bạn cần phải nói cho Matlab không sử dụng phiên bản riêng của các thư viện được chia sẻ và thay vào đó hãy sử dụng các phiên bản từ /opt/local/lib.

Bạn có thể thực hiện việc này theo một trong hai cách. Trước tiên, hãy thử chạy chương trình của bạn và lưu ý tên của thư viện mang lại lỗi. Sau đó, hoặc:

  1. Tìm tệp thư viện trong /Applications/MATLAB_R2013b.app/bin/maci64 và đổi tên hoặc di chuyển tệp. Ví dụ: đổi tên /Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib thành /Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib.bak. Điều này có thể có hậu quả ngoài ý muốn nếu chức năng Matlab khác phụ thuộc vào thư viện đó. Bạn không cần phải làm bất cứ điều gì khác để OpenCV tìm đúng thư viện trong /opt/local/lib.
  2. Đóng Matlab và bắt đầu nó từ dòng lệnh bằng cách đầu tiên thiết lập các biến DYLD_INSERT_LIBRARIES môi trường, như:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

    Trong trường hợp của tôi, sau khi tôi giải quyết vấn đề với libtiff.5.dylib, tôi cũng đã có một vấn đề với libfreetype.6.dylib, vì vậy tôi nói thêm rằng vào biến DYLD_INSERT_LIBRARIES, như:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

Sau đó thử chạy lại chương trình của bạn. Nếu bạn gặp lỗi phiên bản thư viện khác, hãy tiếp tục lặp lại và đổi tên/di chuyển thư viện từ /Applications/MATLAB_R2013b.app/bin/maci64 hoặc thêm đường dẫn thư viện chính xác vào biến DYLD_INSERT_LIBRARIES. Cuối cùng, nó sẽ hoạt động!

Sau khi tôi thực hiện tất cả các bước này, tôi đã có thể chạy lệnh Matlab của tôi thành công:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

Hãy cho tôi biết nếu các bước đã làm hoặc không làm việc cho bạn, và cho dù tôi bỏ qua bất kỳ bước hoặc làm bất cứ điều gì phức tạp hơn nó phải là.

Tôi hy vọng điều này sẽ giúp ai đó! Tôi đã dành vài ngày để kết nối Internet và làm phiền Kota để cuối cùng đến được giải pháp đúng.

+0

Tôi gặp lỗi khi chạy mexopencv.make; 'Trong tập tin bao gồm từ src/MxArray.cpp: 6: bao gồm/MxArray.hpp: 14: 10: lỗi nghiêm trọng: 'opencv2/opencv.hpp' tập tin không tìm thấy #include" opencv2/opencv.hpp' Thông tin thêm về lỗi ở đây: http://pastie.org/private/wstqunwnwqhfm547qxlkw – melwil

+0

Tìm kiếm một chút về vấn đề này, tôi đã tìm thấy https://github.com/kyamagu/mexopencv/issues/90. Chạy từ commandline theo cách thông thường dường như làm việc cho tôi sau khi chạy các bước 1-5. Nếu tôi không báo cáo lại, nó sẽ làm việc cho tôi. – melwil

Các vấn đề liên quan