Hướng dẫn does opencv work with python? - opencv có hoạt động với python không?

Mục tiêu

Learn:

  • Làm thế nào các ràng buộc opencv-python được tạo ra?
  • Làm thế nào để mở rộng các mô -đun OpenCV mới thành Python?

Làm thế nào các ràng buộc opencv-python được tạo ra?

Trong OpenCV, tất cả các thuật toán được triển khai trong C ++. Nhưng các thuật toán này có thể được sử dụng từ các ngôn ngữ khác nhau như Python, Java, v.v ... Điều này được thực hiện bởi các trình tạo ràng buộc. Các trình tạo này tạo ra một cầu nối giữa C ++ và Python cho phép người dùng gọi các chức năng C ++ từ Python. Để có được một bức tranh hoàn chỉnh về những gì đang xảy ra trong nền, một kiến ​​thức tốt về API Python/C là bắt buộc. Một ví dụ đơn giản về việc mở rộng các chức năng C ++ sang Python có thể được tìm thấy trong tài liệu Python chính thức [1]. Vì vậy, việc mở rộng tất cả các chức năng trong OpenCV sang Python bằng cách viết các chức năng trình bao của chúng theo cách thủ công là một nhiệm vụ tốn thời gian. Vì vậy, Opencv làm điều đó một cách thông minh hơn. OpenCV tạo các chức năng trình bao bọc này tự động từ các tiêu đề C ++ bằng một số tập lệnh Python được đặt trong các mô -đun/python/src2. Chúng tôi sẽ xem xét những gì họ làm.

Đầu tiên, các mô -đun/python/cmakefiles.txt là một tập lệnh cmake kiểm tra các mô -đun được mở rộng đến python. Nó sẽ tự động kiểm tra tất cả các mô -đun để được mở rộng và lấy các tệp tiêu đề của họ. Các tệp tiêu đề này chứa danh sách tất cả các lớp, chức năng, hằng số, vv cho các mô -đun cụ thể đó.

Thứ hai, các tệp tiêu đề này được chuyển cho tập lệnh Python, Mô -đun/Python/SRC2/Gen2.py. Đây là tập lệnh trình tạo liên kết Python. Nó gọi một mô -đun tập lệnh Python khác/python/src2/hdr_parser.py. Đây là tập lệnh trình phân tích cú pháp tiêu đề. Trình phân tích cú pháp tiêu đề này phân chia tệp tiêu đề hoàn chỉnh thành danh sách Python nhỏ. Vì vậy, các danh sách này chứa tất cả các chi tiết về một chức năng cụ thể, lớp, v.v. Ví dụ, một hàm sẽ được phân tích cú pháp để có được danh sách chứa tên chức năng, loại trả về, đối số đầu vào, loại đối số, v.v. Danh sách cuối cùng chứa chi tiết của tất cả các hàm, cấu trúc , các lớp, vv trong tập tin tiêu đề đó.

Nhưng trình phân tích cú pháp tiêu đề không phân tích tất cả các chức năng/lớp trong tệp tiêu đề. Nhà phát triển phải chỉ định các chức năng nào nên được xuất sang Python. Đối với điều đó, có một số macro nhất định được thêm vào đầu các khai báo này cho phép trình phân tích cú pháp tiêu đề xác định các chức năng được phân tích cú pháp. Các macro này được thêm vào bởi nhà phát triển lập trình chức năng cụ thể. Nói tóm lại, nhà phát triển quyết định các chức năng nào sẽ được mở rộng cho Python và những gì không. Chi tiết về những macro đó sẽ được đưa ra trong phiên tiếp theo.

Vì vậy, trình phân tích cú pháp tiêu đề trả về một danh sách lớn cuối cùng các chức năng phân tích cú pháp. Tập lệnh trình tạo của chúng tôi (Gen2.py) sẽ tạo các hàm trình bao bọc cho tất cả các hàm/lớp/enum/structs được phân tích cú pháp tiêu đề (bạn có thể tìm thấy các tệp tiêu đề này trong quá trình biên dịch trong bản dựng/mô -đun/python/thư mục dưới dạng pyopencv_generated _*. ). Nhưng có thể có một số kiểu dữ liệu OpenCV cơ bản như MAT, VEC4I, Kích thước. Họ cần được mở rộng bằng tay. Ví dụ, một loại thảm phải được mở rộng thành mảng numpy, kích thước nên được mở rộng thành một bộ của hai số nguyên, vv Tương tự, có thể có một số cấu trúc/lớp/chức năng phức tạp, vv cần được mở rộng bằng tay. Tất cả các chức năng trình bao bọc thủ công như vậy được đặt trong các mô -đun/python/src2/cv2.cpp.

Vì vậy, bây giờ chỉ còn lại là tổng hợp của các tệp trình bao bọc này cung cấp cho chúng tôi mô -đun CV2. Vì vậy, khi bạn gọi một hàm, giả sử res = cân bằng (IMG1, IMG2) trong Python, bạn vượt qua hai mảng Numpy và bạn mong đợi một mảng numpy khác làm đầu ra. Vì vậy, các mảng numpy này được chuyển đổi thành cv :: mat và sau đó gọi hàm cqualilizeHist () trong c ++. Kết quả cuối cùng, RES sẽ được chuyển đổi trở lại thành một mảng numpy. Vì vậy, trong ngắn hạn, hầu hết các hoạt động được thực hiện trong C ++ cho chúng ta gần như tốc độ với C ++.cv2 module. So when you call a function, say res = equalizeHist(img1,img2) in Python, you pass two numpy arrays and you expect another numpy array as the output. So these numpy arrays are converted to cv::Mat and then calls the equalizeHist() function in C++. Final result, res will be converted back into a Numpy array. So in short, almost all operations are done in C++ which gives us almost same speed as that of C++.

Vì vậy, đây là phiên bản cơ bản của cách các ràng buộc OpenCV-Python được tạo ra.

Làm thế nào để mở rộng các mô -đun mới đến Python?

Trình phân tích cú pháp tiêu đề phân tích các tệp tiêu đề dựa trên một số macro bao bọc được thêm vào khai báo chức năng. Hằng số liệt kê không cần bất kỳ macro nào. Chúng được tự động gói. Nhưng các chức năng còn lại, các lớp, vv Cần bao bọc macro.

Các chức năng được mở rộng bằng macro CV_Exports_W. Một ví dụ đã được biểu diễn ở dưới.

Trình phân tích cú pháp tiêu đề có thể hiểu các đối số đầu vào và đầu ra từ các từ khóa như inputArray, outputArray, v.v. Nhưng đôi khi, chúng ta có thể cần phải đầu vào mã hóa và đầu ra. Đối với điều đó, các macro như cv_out, cv_in_out, v.v. được sử dụng.

Đối với các lớp lớn cũng, CV_Exports_W được sử dụng. Để mở rộng các phương thức lớp, CV_WRAP được sử dụng. Tương tự, CV_Prop được sử dụng cho các trường lớp.

{

public::

CV_WRAP VirtualVoid setClipLimit (kép cliplimit) = 0;virtual void setClipLimit(double clipLimit) = 0;

CV_WRAP VirtualDouble getClipLimit () const = 0;virtual double getClipLimit() const = 0;

}

Các chức năng quá tải có thể được mở rộng bằng CV_Exports_as. Nhưng chúng ta cần chuyển một tên mới để mỗi hàm sẽ được gọi bằng tên đó trong Python. Lấy trường hợp của chức năng tích hợp dưới đây. Ba chức năng có sẵn, vì vậy mỗi chức năng được đặt tên với một hậu tố trong Python. Tương tự CV_WRAP_AS có thể được sử dụng để bọc các phương thức quá tải.

OutputArray sqsum, int sdepth = -1, int sqDepth = -1);int sdepth = -1, int sqdepth = -1 );

int sdepth = -1, int sqDepth = -1); sdepth = -1, int sqdepth = -1 );

Các lớp/cấu trúc nhỏ được mở rộng bằng CV_Exports_W_Simple. Các cấu trúc này được truyền theo giá trị cho các hàm C ++. Các ví dụ là Keypoint, khớp, vv Các phương thức của chúng được mở rộng bởi CV_WRAP và các trường được mở rộng bởi CV_PROP_RW.

{

public::

Cv_wrap dmatch (int _queryIdx, int _trainidx, float _distance);int _queryIdx, int _trainIdx, float _distance);

Cv_wrap dmatch (int _queryIdx, int _trainidx, int _imgidx, float _distance);int _queryIdx, int _trainIdx, int _imgIdx, float _distance);

CV_Prop_RW Int QueryIdx;int queryIdx;

CV_Prop_RW Int Trainidx;int trainIdx;

CV_PROP_RW INT IMGIDX;int imgIdx;

};

Một số lớp/cấu trúc nhỏ khác có thể được xuất bằng CV_EXPORTS_W_MAP nơi nó được xuất sang từ điển bản địa Python. Khoảnh khắc () là một ví dụ về nó.

{

public::

Cv_wrap dmatch (int _queryIdx, int _trainidx, float _distance);double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;

Cv_wrap dmatch (int _queryIdx, int _trainidx, int _imgidx, float _distance);double mu20, mu11, mu02, mu30, mu21, mu12, mu03;

CV_Prop_RW Int QueryIdx;double nu20, nu11, nu02, nu30, nu21, nu12, nu03;

};

Một số lớp/cấu trúc nhỏ khác có thể được xuất bằng CV_EXPORTS_W_MAP nơi nó được xuất sang từ điển bản địa Python. Khoảnh khắc () là một ví dụ về nó.

OpenCV và Python có giống nhau không?

OpenCV là một thư viện Python được thiết kế để giải quyết các vấn đề về thị lực máy tính. OpenCV ban đầu được phát triển vào năm 1999 bởi Intel nhưng sau đó nó được hỗ trợ bởi Willow Garage. OpenCV hỗ trợ nhiều ngôn ngữ lập trình như C ++, Python, Java, v.v. which is designed to solve computer vision problems. OpenCV was originally developed in 1999 by Intel but later it was supported by Willow Garage. OpenCV supports a wide variety of programming languages such as C++, Python, Java etc.

Làm thế nào để Python tích hợp với OpenCV?

Để sử dụng OpenCV, chúng ta cần cài đặt nó ...
Bước 1 - Đảm bảo Python và PIP được cài đặt sẵn trên hệ thống của bạn. Nhập các lệnh sau trong dấu nhắc lệnh để kiểm tra là Python và PIP được cài đặt trên hệ thống của bạn. Để kiểm tra Python. ....
Bước 2 - Cài đặt OpenCV. OpenCV có thể được cài đặt bằng PIP ..

Phiên bản Python hoạt động với OpenCV nào?

Nó sử dụng Python 3 đi kèm với hệ thống.Nếu bạn muốn sử dụng cài đặt Python 3 của riêng mình, hãy xem cách cài đặt OpenCV cho Python.Bây giờ bạn nên cài đặt PIP.Python 3 that comes with the system. If you want to use your own Python 3 installation, let's see how to install OpenCV for Python. Now you should have pip installed.

OpenCV có tốt hơn trong C ++ hay Python không?

Thời gian chạy chậm hơn: So với C ++, các chương trình của bạn trong Python thường sẽ chạy chậm hơn.Để thêm một cú đấm bổ sung, bạn có thể sử dụng GPU (sử dụng CUDA hoặc OpenCL) trong OpenCV (C ++) và có mã chạy nhanh hơn 10 lần so với triển khai Python. : Compared to C++, your programs in Python will typically run slower. To add an extra punch you can use the GPU ( using CUDA or OpenCL ) in OpenCV (C++) and have code that runs 10x faster than the Python implementation.