C++ to Python Converter tạo mã Python tuyệt vời, giúp bạn tiết kiệm hàng giờ làm việc chăm chỉ và thời gian quý báu Show
Dùng thử bản miễn phí
Mua phiên bản cao cấp
Giấy phép Thông tin Hỗ trợ Gỡ cài đặt Hướng dẫn Xem trước 10 giây
*Cuộn sang phải để xem ảnh chụp màn hình Trình chuyển đổi C++ sang Python Lợi ích chính
Câu hỏi thường gặpQ. Các tệp C++ gốc có bị thay đổi theo bất kỳ cách nào không? Mã hiện tại của bạn vẫn còn nguyên vẹn. Các tệp Python mới được xuất ra vị trí mới mà bạn chỉ định Q. Phiên bản C++ nào được chuyển đổi? Chúng tôi cố gắng chuyển đổi nhiều nhất có thể và liên tục cập nhật trình chuyển đổi để xử lý các tính năng C++ mới hơn. Tuy nhiên, nhiều tính năng mới của C++ không có Python tương đương nên đầu ra sẽ yêu cầu điều chỉnh Q. Độ chính xác chuyển đổi là gì? Độ chính xác của chúng tôi rất cao, nhưng sẽ có những điều chỉnh đáng kể cần thiết cho tất cả trừ những chuyển đổi tầm thường nhất. Không có tương đương trực tiếp cho một số khía cạnh của C++. Đọc phần còn lại của Câu hỏi thường gặp để có ý tưởng về một vài điều không được chuyển đổi. Trình chuyển đổi C++ sang Python nhằm mục đích giảm số lượng công việc bạn phải thực hiện để chuyển đổi mã sang Python, nhưng đây chỉ là bước đầu tiên Bạn không nên cố gắng chuyển đổi mã phụ thuộc nhiều vào số học con trỏ hoặc siêu lập trình mẫu vì các tính năng này chỉ thực tế trong C++ Q. Còn đối với các Container STL thì sao? Trình chuyển đổi C++ sang Python chuyển đổi các tham chiếu sang một số loại bộ chứa STL, chẳng hạn như std. véc tơ. Các vùng chứa không có tương đương rõ ràng không được chuyển đổi Q. Mã C++/CLI có được chuyển đổi không? Không. Bất chấp tên gọi, C++/CLI có rất ít điểm chung với C++ Q. Còn mã giao diện người dùng C++ thì sao? Trình chuyển đổi không chuyển đổi các loại giao diện người dùng C++ do thiếu sự tương đồng giữa các loại này và các loại giao diện người dùng Python Hãy tưởng tượng viết thư viện Thị giác Máy tính bằng OpenCV. Bạn muốn mã của mình dễ dàng chuyển sang Linux, Mac, Windows, iOS, Android và thậm chí cả các thiết bị nhúng. Vì vậy, bạn chọn xây dựng thư viện của mình bằng C++ bằng OpenCV. sự lựa chọn tuyệt vời Cùng với đó là một khách hàng muốn cấp phép cho toàn bộ thư viện của bạn nhưng họ muốn nó được phân phối dưới dạng mô-đun Python. Bạn nói, “Không có vấn đề gì. ” và tìm kiếm trên internet một giải pháp. BÙM. bạn hạ cánh trên bài viết này. Thật tuyệt vời. Chúng ta sẽ học cách xây dựng một mô-đun Python từ mã OpenCV C++ của bạn Hướng dẫn này đã được thử nghiệm trên Linux 16. 04 với Python 3. 5. 2 và OpenCV 3. 4 Ràng buộc Python cho mã C++Điều thú vị về một thư viện được viết bằng ngôn ngữ lập trình hệ thống như C++ là có những cách tiêu chuẩn để tạo ràng buộc cho thư viện này bằng ngôn ngữ cấp cao hơn như Python. Trước khi bắt tay vào giải pháp, tôi muốn giải thích ngắn gọn cách tạo các liên kết Python cho mã C++ của bạn. Nếu bạn muốn hiểu chi tiết kỹ thuật cơ bản về cách mã C++ chung của bạn có thể được sử dụng để xây dựng một mô-đun python, hãy xem hướng dẫn này. Để tóm tắt các bước, bạn cần các phần sau
Tất cả đều ổn và bảnh bao nhưng nếu bạn có một thư viện lớn, làm việc này bằng tay thì cồng kềnh và dễ bị lỗi. Vì vậy, chúng tôi sẽ tự động tạo hầu hết mã này bằng cách sử dụng tập lệnh python Tôi đã hợp tác độc quyền với OpenCV. org mang đến cho bạn các khóa học chính thức về Trí tuệ nhân tạo, Thị giác máy tính và Học sâu để đưa bạn vào lộ trình có cấu trúc từ những bước đầu tiên đến khi thành thạo Tìm hiểu thêm Các ràng buộc Python cho mã C++ dựa trên OpenCVNhư bạn có thể biết, OpenCV được viết bằng C++. Những người giỏi ở OpenCV đã tạo các liên kết cho Python cho phép chúng tôi biên dịch OpenCV thành một mô-đun Python (cv2) Sẽ không tuyệt sao nếu chúng ta có thể thực hiện công việc đã được cộng đồng thực hiện? Chúng tôi sẽ sử dụng cùng một tập lệnh được OpenCV sử dụng để tạo mô-đun Python của họ và thay đổi tối thiểu tệp trình bao bọc chính của họ (cv2. cpp) để tạo mô-đun của riêng chúng tôi. Chúng tôi sẽ gọi mô-đun này là bv theo tên công ty tư vấn Big Vision LLC của tôi Có rất nhiều lợi ích cho phương pháp này
Mã nằm trong thư mục pymodule của cơ sở mã. Cấu trúc thư mục được hiển thị bên trái Nó có các tập tin sau
Tải xuống mã Để dễ dàng làm theo hướng dẫn này, vui lòng tải xuống mã bằng cách nhấp vào nút bên dưới. Nó miễn phí. Tải xuống mã import cv2 import sys sys.path.append('build') import bv im = cv2.imread('holes.jpg', cv2.IMREAD_GRAYSCALE) imfilled = im.copy() bv.fillHoles(imfilled) filters = bv.bv_Filters() imedge = filters.edge(im) cv2.imshow("Original image", im) cv2.imshow("Python Module Function Example", imfilled) cv2.imshow("Python Module Class Example", imedge) cv2.waitKey(0) 3. gen2. py, hdr_parser. py. Tập lệnh tạo ràng buộc Python (gen2. py) gọi tập lệnh trình phân tích cú pháp tiêu đề (hdr_parser. py). Các tệp này được cung cấp như một phần của tệp nguồn OpenCV. Theo hướng dẫn OpenCV, “trình phân tích cú pháp tiêu đề này chia tệp tiêu đề hoàn chỉnh thành các 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 hàm, lớp cụ thể, v.v. ” Nói cách khác, các tập lệnh này tự động phân tích các tệp tiêu đề và đăng ký các hàm, lớp, phương thức, v.v. với mô-đun. #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }3 và lớp #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }4 chỉ với một phương thức có tên là #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }7. Hàm fillHoles lấy một hình ảnh tỷ lệ xám và lấp đầy bất kỳ lỗ hổng nào (các vùng tối bao quanh bởi các vùng màu trắng). Phương pháp #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }7 chỉ đơn giản là thực hiện phát hiện cạnh Canny. #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } } 7. src/bvmodule. hpp. Không phải tất cả các hàm và phương thức trong mã của bạn đều cần được hiển thị với mô-đun Python. Tệp tiêu đề này đề cập rõ ràng những tệp chúng tôi muốn xuất #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }1 Lưu ý . Chúng tôi đã sử dụng InputArray và OutputArray thay vì Mat trong phương thức cạnh của lớp. Làm như vậy tạo ra imedge đầu ra trong mã Python đã xuất và chúng tôi có thể sử dụng dòng này trong ví dụ Python ở trên. #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }2 Các bước để xây dựng mô-đun PythonBây giờ chúng ta đã sẵn sàng để thực hiện các bước xây dựng mô-đun Python của mình
#include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }3 Bước 4. Sử dụng gen2. py để tạo các tệp ràng buộc Python. Bạn cần chỉ định tiền tố (pybv), vị trí của các tệp tạm thời (bản dựng) và vị trí của các tệp tiêu đề (tiêu đề. txt) #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }4 Điều này sẽ tạo ra một loạt các tệp tiêu đề có tiền tố pybv_*. h. Nếu bạn tò mò, vui lòng kiểm tra các tệp được tạo Bước 5. Biên dịch mô-đun #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }5 Trong Dòng 2, chúng tôi chỉ định các tệp nguồn. Trong Dòng 3, chúng tôi đặt tên mô-đun bằng MODULE_STR và MODULE_PREFIX (pybv) được sử dụng ở bước trước. Trong Dòng 4, chúng tôi chỉ định phiên bản Python. Trong Dòng 5, chúng tôi bao gồm thư viện OpenCV và các tệp tiêu đề và trong Dòng 6, chúng tôi bao gồm các tệp tiêu đề liên quan đến Python 3 và một số thư viện tiêu chuẩn. Trong máy của tôi, numpy không có trong đường dẫn được bao gồm và vì vậy tôi phải thêm một Dòng 7 bổ sung cho numpy. Vị trí của bạn cho numpy có thể khác. Cuối cùng, trong Dòng 8, chúng tôi chỉ định vị trí của mô-đun đầu ra (build/bv. Vì thế) Kiểm tra mô-đun Pythonkịch bản bvtest. py tải mô-đun và sử dụng hàm #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }1 và lớp đã xuất #include"bvmodule.hpp" namespace bv { void fillHoles(Mat &im) { Mat im_th; // Binarize the image by thresholding threshold(im, im_th, 128, 255, THRESH_BINARY); // Flood fill Mat im_floodfill = im_th.clone(); floodFill(im_floodfill, cv::Point(0,0), Scalar(255)); // Invert floodfilled image Mat im_floodfill_inv; bitwise_not(im_floodfill, im_floodfill_inv); // Combine the two images to fill holes im = (im_th | im_floodfill_inv); } void Filters::edge(InputArray im, OutputArray imedge) { // Perform canny edge detection Canny(im,imedge,100,200); } Filters::Filters() { } }2. Nếu bạn biên dịch đúng mọi thứ và chạy tập lệnh python, bạn sẽ thấy kết quả hiển thị bên dưới Làm cách nào để thay đổi cpp thành Python?Một số mẹo thiết thực . Bỏ thói quen cũ — Ngừng sử dụng trình biên dịch C++ làm công cụ sửa lỗi. . Có thói quen mới — Bắt đầu sử dụng thư viện. . Sử dụng các thư viện chung của C++ và Python — Một số thư viện C++, như OpenCV và QT, có giao diện Python. . Đừng quên nguồn gốc của bạn — Đôi khi Python quá chậm hoặc không tối ưu cho tác vụ Tôi có thể sử dụng mã C++ trong Python không?Bạn có phải là nhà phát triển Python có thư viện C hoặc C++ mà bạn muốn sử dụng từ Python không? . Python bindings allow you to call functions and pass data from Python to C or C++, letting you take advantage of the strengths of both languages.
Có thể chuyển đổi chương trình C sang Python không?Về cơ bản, không thể chuyển đổi mã C sang Python . Nhưng thật dễ dàng để làm điều ngược lại, nơi bạn chuyển Python sang mã C. Đó là bởi vì C là bộ hướng dẫn lớn hơn, bao gồm nhiều thứ mà Python đơn giản là không thể làm được, chẳng hạn như con trỏ, lời gọi hệ thống, quản lý bộ nhớ của riêng bạn, v.v. |