2010-02-09 69 views
7

Đã cài đặt thành công opencv 2.0 với các ràng buộc python Tôi bắt đầu gặp rắc rối và trước khi tôi tiến xa hơn, tôi tự hỏi liệu mình có nên thay đổi sang tùy chọn khác hay không. Như ezod trên số điện thoại post này cho biết:Tôi nên sử dụng phiên bản python opencv nào?

"Như trước đây, khi bản phát hành 2.0, các ràng buộc Python mới không đầy đủ: nhiều chức năng tôi cho là thiếu quan trọng. Các ràng buộc ctypes-opencv (dự án bên thứ 3), như phiên bản 0.8.0, không hỗ trợ OpenCV 2.0. "

Vì vậy, tôi có nên chiến đấu với 2.0 hoặc tôi nên đi đến ctypes không? Tôi đang bỏ lỡ điều gì?

Tôi đang sử dụng OSX, python 2.5 và muốn theo dõi trong 2ngày đối tượng chuyển động và không phải là chuyên gia về trăn cũng như máy nhìn!

+0

Thời gian đã giải quyết được sự cố của tôi. Phiên bản hiện tại của opencv 2.2 có triển khai thực hiện tốt python. Cuối cùng trở lại dự án này khi đã cài đặt opencv bằng homebrew (xem trang wiki tại willowgarage để được hướng dẫn). – PhoebeB

+0

Lưu ý rằng (ít nhất là ngay bây giờ) cài đặt homebrew mặc định cho opencv không cài đặt các ràng buộc C++ (opencv. *), Nhưng chỉ có các ràng buộc C không gian tên cv. Ngoài ra, bạn có thể muốn cài đặt ffmpeg trước. Không gian tên opencv có thể có sẵn cũng được cài đặt một số gói (SWIG chẳng hạn?) –

Trả lời

1

Tôi đang sử dụng OpenCV 2.0 tự biên dịch và tích hợp python được tích hợp sẵn. Cho đến bây giờ tôi đã thiếu 2 hoặc 3 chức năng (ví dụ: FindFundamentalMat). Nếu bạn lấy mã nguồn của OpenCV bạn tìm thấy một tệp văn bản giao diện/python/api xác định tham số và kiểu trả về cho mỗi hàm OpenCV có sẵn từ Python. Khi biên dịch lại, một trình tạo tự động sẽ phân tích cú pháp tệp này và xây dựng phần mở rộng python. Đối với tất cả các trường hợp tôi đã trải qua, tôi thấy rằng việc thêm một định nghĩa thích hợp vào api cho các chức năng tôi cần, sau đó biên dịch lại opencv, hoạt động khá tốt.

+0

Bạn có thấy bất kỳ nhược điểm nào của việc đi tuyến này thay vì sử dụng ctypes không? – PhoebeB

+0

ctypes-opencv không hoạt động với OpenCV 2.0 afaik (không kiểm tra). Tôi chỉ tìm thấy một cái mới mặc dù, http://code.google.com/p/pyopencv/ Tôi chưa bao giờ thử nó nhưng nó trông cực kỳ hứa hẹn! Nó tuyên bố có tích hợp tốt numpy :-) – dudemeister

+0

Tôi chỉ thấy rằng pyopencv (liên kết mà tôi đăng) được dựa trên Boost.Python thay vì ctypes. Đây là một quyết định rất tốt kể từ khi ctypes chỉ hỗ trợ gói chức năng phẳng (bạn không thể trực tiếp quấn một lớp C++ nhưng phải mã hóa đối tượng C++ gói bằng tay). Điều này có nghĩa là pyopencv có thể tốt hơn vì nó bao bọc đối tượng OpenCV thực (như Mat). Nó thậm chí còn cung cấp cú pháp lập chỉ mục gọn gàng gọn gàng trực tiếp vào các mảng OpenCV \ o/ – dudemeister

0

Tôi khuyên bạn nên sử dụng the official Python bindings to OpenCV 2.1 mà theo như tôi đã thấy có tính năng chẵn lẻ với các thư viện C++. Hầu hết trong số họ có hoặc là một wrapper pythonic, hoặc một bản dịch trực tiếp từ phiên bản C++.

Tài liệu OpenCV của Python không hoàn chỉnh như C++, nhưng nếu bạn cảm thấy rằng lợi thế ngôn ngữ để tạo mẫu có giá trị, bạn sẽ có thể hiểu việc sử dụng Python từ C++ documentation.

Hãy coi chừng nhiều mã mẫu hiện tại bạn sẽ tìm thấy là từ các phiên bản trước và không tương thích (ví dụ: mọi thứ nằm trong gói cv), nhưng không khó để biết cách cập nhật nó.

3

Câu trả lời trễ. Nếu bạn không phải phụ thuộc vào các phiên bản trước đó và muốn sử dụng OpenCV với Python, hãy chọn phiên bản ổn định mới nhất. Hôm nay nó là OpenCV 2.3.1.

Lợi ích chính của OpenCV ≥ 2.3 cho Python người dùng: a cv2 mô-đun mới, thêm vào cái cũ (tương thích ngược) cv module. Mô-đun cv2 mới có nhiều chi tiết hơn và không yêu cầu phân bổ bộ nhớ thủ công cho cấu trúc dữ liệu trung gian. Mô-đun cũ cv giống với bản dịch trực tiếp của API C++.

Ví dụ, so sánh Python mới cv2.findContours (OpenCV ≥ 2.3):

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy 

Nó đòi hỏi chỉ có ba thông số, và có thể xử lý tất cả các cấp phát bộ nhớ tự động, chỉ trả về kết quả cuối cùng. Chỉ một dòng mã người dùng.

Vs.cũ cv.FindContours:

FindContours(image, storage [, mode [, method [, offset]]]) -> None 

Yêu cầu người dùng phân bổ rõ ràng "lưu trữ" trước cuộc gọi (+ 1 hoặc 2 dòng mã). Nó không trả về kết quả, thay vào đó nó lưu nó trong kho lưu trữ được phân bổ (nó hoạt động giống như một danh sách liên kết, và người dùng phải viết một số vòng để thực sự trích xuất dữ liệu ra khỏi bộ nhớ). Nhìn chung, mức độ thấp hơn, và giống C++ hơn Python. Ít nhất 4-5 dòng mã trong trường hợp sử dụng phổ biến, thay vì chỉ một dòng với mô-đun cv2 mới.

+0

cũng một số hằng số không được ánh xạ. Các giải pháp để tìm chúng tại đây: http://stackoverflow.com/questions/9661512/python-opencv-imwrite-cant-find-params/9934725#9934725 – Neon22

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