Làm cách nào để thay đổi mã cpp của tôi thành python?

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

Dùng thử bản miễn phí

  • Miễn phí
  • Chuyển đổi chất lượng cao
  • Đầu ra chuyển đổi hạn chế
Tải xuống

Mua phiên bản cao cấp

  • $149 US mỗi năm (bảo hành 15 ngày)
  • Chuyển đổi chất lượng cao
  • Đầu ra chuyển đổi không giới hạn
Mua, tựa vào, bám vào


Giấy phép Thông tin     Hỗ trợ     Gỡ cài đặt Hướng dẫn


Xem trước 10 giây

  • Chuyển đổi thư mục

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi bộ sưu tập từ C++ sang Python

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi mảng C++ sang Python

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi C++ sang Python của các tính năng C++ hiện đại

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi C++ sang Python Indexer

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi xử lý ngoại lệ từ C++ sang Python

    Làm cách nào để thay đổi mã cpp của tôi thành python?

  • Chuyển đổi con trỏ hàm từ C++ sang Python

    Làm cách nào để thay đổi mã cpp của tôi thành python?

*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

  • Tiết kiệm thời gian quý báu
  • Chính xác và toàn diện
  • dễ sử dụng
  • An toàn - mã của bạn không bao giờ rời khỏi máy của bạn
  • Hỗ trợ khách hàng đáp ứng
  • Đảm bảo hoàn tiền trong 15 ngày
  • Linh hoạt - chuyển đổi đoạn mã, tệp và thư mục từ C++ sang Python
  • Nhanh - hàng chục nghìn dòng được chuyển đổi từ C++ sang Python mỗi phút
  • Nhận xét chuyển đổi hữu ích
  • Công cụ giáo dục tuyệt vời cho các nhà phát triển C++ học Python
  • Nhiều tùy chọn chuyển đổi và định dạng

Câu hỏi thường gặp

Q. 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

  1. Viết hàm bao bọc có thể gọi Python. Hàm này phân tích các đối số và gọi hàm C/C++ thực tế. Nó cũng xử lý bất kỳ lỗi nào
  2. Đăng ký chức năng và phương pháp. Tiếp theo, bạn cần sử dụng
    #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() 
      {
      }
    }
    
    8 để đăng ký chức năng trong bảng ký hiệu của mô-đun
  3. Tạo một hàm init. Cuối cùng, chúng ta cần sử dụng
    #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() 
      {
      }
    }
    
    9 để tạo chức năng khởi tạo cho mô-đun

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 OpenCV

Như 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

  1. Lập bản đồ hiệu quả và nhất quán. Có các loại Python hiệu quả được ánh xạ tới các loại C++ hiệu quả phù hợp với ánh xạ của OpenCV
  2. thành ngữ phù hợp. Có thành ngữ phù hợp với thư viện có nghĩa là chúng tôi đang tận dụng công việc khó khăn được thực hiện bởi cộng đồng. Chẳng hạn, trong OpenCV sử dụng loại đối số 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() 
      {
      }
    }
    
    0 thay vì
    #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() 
      {
      }
    }
    
    0 trong định nghĩa hàm sẽ tự động biến nó thành đầu ra được trả về bởi hàm trong mô-đun Python đã xuất
  3. Chức năng dễ dàng và định nghĩa lớp. Điều này cho phép dễ dàng ánh xạ các lớp và chức năng. Chúng ta chỉ phải định nghĩa chúng một lần trong C++. Nếu được thực hiện bằng tay, cuối cùng bạn sẽ thực hiện công việc tương đương với việc xác định lại một lớp trong Python

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

Làm cách nào để thay đổi mã cpp của tôi thành python?

Nó có các tập tin sau

  1. bệnh viện. cpp, pycompat. hpp. bệnh viện. cpp là phiên bản được sửa đổi một chút của tệp trình bao bọc (cv2. cpp) đi kèm với OpenCV. Nó sử dụng pycompat. hpp để kiểm tra khả năng tương thích Python 2/3
  2. bvtest. py. Mã Python để kiểm tra mô-đun của chúng tôi (bv) sau khi chúng tôi đã xây dựng nó. Trong ví dụ của chúng tôi, chúng tôi có một 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à một 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() 
      {
      }
    }
    
    2 được hiển thị trong mô-đun Python. Việc triển khai C++ của
    #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à
    #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 nằm trong src/bvmodule. cpp

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.
4. tiêu đề. txt. Một tệp văn bản chứa tất cả các tệp tiêu đề sẽ được biên dịch vào mô-đun. Trong ví dụ của chúng tôi, nó chỉ chứa một dòng src/bvmodule. hpp.
5. hố. jpg. Hình ảnh ví dụ được sử dụng bởi tập lệnh thử nghiệm mô-đun Python bvtest của chúng tôi. p
6. src/bvmodule. cpp. Tệp cpp này chứa các hàm và định nghĩa lớp. Trong ví dụ này, chúng tôi đã triển khai 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() 
  {
  }
}
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 Python

Bâ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

  1. Bước 1. Đặt các tệp tiêu đề và mã nguồn C++ của bạn vào trong thư mục src
  2. Bước 2. Bao gồm tệp tiêu đề của bạn trong tiêu đề. txt
  3. Bước 3. Tạo một thư mục xây dựng

#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 Python

kị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.