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).
- Nhận mexopencv từ http://www.cs.sunysb.edu/~kyamagu/mexopencv/
- Thực hiện Mathworks workaround để có được những mex biên dịch Matlab làm việc với Xcode 5
- Run
mex -setup
từ bên trong Matlab
Sửa đổi mới tạo ~/.matlab/R2013b/Tệp mexopts.sh như sau:
- Thay thế tất cả các tham chiếu của "-lstdC++" bằng "-lC++"
- 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).
- 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
- 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]
- 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.
- 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
.
- Đả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
- 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:
- 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
.
Đó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.
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
Hãy xem [this] (http://stackoverflow.com/questions/16078512/undefined-symbols-for-architecture-x86-64-error-when-linking-opencv-in-xcode) – Vuwox
@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. –