• 【Pybind11】Python调用C++接口(Ubuntu下编译OpenCV)


    C++

    main.cpp

     
     
    #include<iostream>
     
    #include<vector>
     
    #include<opencv2/opencv.hpp>
     
    #include<pybind11/pybind11.h>
     
    #include<pybind11/numpy.h>
     
    #include<pybind11/stl.h>
     
    #include"mat_warper.h"
     
     
     
    namespace py = pybind11;
     
     
     
    py::array_t<unsigned char> test_rgb_to_gray(py::array_t<unsigned char>& input) {
     
     
     
    cv::Mat img_rgb = numpy_uint8_3c_to_cv_mat(input);
     
    cv::Mat dst;
     
    cv::cvtColor(img_rgb, dst, cv::COLOR_RGB2GRAY);
     
    return cv_mat_uint8_1c_to_numpy(dst);
     
     
     
    }
     
     
     
    py::array_t<unsigned char> test_gray_canny(py::array_t<unsigned char>& input) {
     
    cv::Mat src = numpy_uint8_1c_to_cv_mat(input);
     
    cv::Mat dst;
     
    cv::Canny(src, dst, 30, 60);
     
    return cv_mat_uint8_1c_to_numpy(dst);
     
    }
     
     
     
     
     
    /*
     
    @return Python list
     
    */
     
    py::list test_pyramid_image(py::array_t<unsigned char>& input) {
     
    cv::Mat src = numpy_uint8_1c_to_cv_mat(input);
     
    std::vector<cv::Mat> dst;
     
     
     
    cv::buildPyramid(src, dst, 4);
     
     
     
    py::list out;
     
    for (int i = 0; i < dst.size(); i++)
     
    {
     
    out.append<py::array_t<unsigned char>>(cv_mat_uint8_1c_to_numpy(dst.at(i)));
     
    }
     
     
     
    return out;
     
    }
     
     
     
    PYBIND11_MODULE(cv_demo1, m) {
     
     
     
    m.doc() = "Simple opencv demo";
     
     
     
    m.def("test_rgb_to_gray", &test_rgb_to_gray);
     
    m.def("test_gray_canny", &test_gray_canny);
     
    m.def("test_pyramid_image", &test_pyramid_image);
     
     
     
    }
     
     

    mat_warper.h

     
     
    #ifndef MAT_WARPER_H_
     
     
     
    #include<opencv2/opencv.hpp>
     
    #include<pybind11/pybind11.h>
     
    #include<pybind11/numpy.h>
     
     
     
    namespace py = pybind11;
     
     
     
    cv::Mat numpy_uint8_1c_to_cv_mat(py::array_t<unsigned char>& input);
     
     
     
    cv::Mat numpy_uint8_3c_to_cv_mat(py::array_t<unsigned char>& input);
     
     
     
    py::array_t<unsigned char> cv_mat_uint8_1c_to_numpy(cv::Mat & input);
     
     
     
    py::array_t<unsigned char> cv_mat_uint8_3c_to_numpy(cv::Mat & input);
     
     
     
    #endif // !MAT_WARPER_H_
     
     

    mat_warper.cpp

     
     
    #include"mat_warper.h"
     
    #include <pybind11/numpy.h>
     
     
     
    /*
     
    Python->C++ Mat
     
    */
     
     
     
     
     
    cv::Mat numpy_uint8_1c_to_cv_mat(py::array_t<unsigned char>& input) {
     
     
     
    if (input.ndim() != 2)
     
    throw std::runtime_error("1-channel image must be 2 dims ");
     
     
     
    py::buffer_info buf = input.request();
     
     
     
    cv::Mat mat(buf.shape[0], buf.shape[1], CV_8UC1, (unsigned char*)buf.ptr);
     
     
     
    return mat;
     
    }
     
     
     
     
     
    cv::Mat numpy_uint8_3c_to_cv_mat(py::array_t<unsigned char>& input) {
     
     
     
    if (input.ndim() != 3)
     
    throw std::runtime_error("3-channel image must be 3 dims ");
     
     
     
    py::buffer_info buf = input.request();
     
     
     
    cv::Mat mat(buf.shape[0], buf.shape[1], CV_8UC3, (unsigned char*)buf.ptr);
     
     
     
    return mat;
     
    }
     
     
     
     
     
    /*
     
    C++ Mat ->numpy
     
    */
     
    py::array_t<unsigned char> cv_mat_uint8_1c_to_numpy(cv::Mat& input) {
     
     
     
    py::array_t<unsigned char> dst = py::array_t<unsigned char>({ input.rows,input.cols }, input.data);
     
    return dst;
     
    }
     
     
     
    py::array_t<unsigned char> cv_mat_uint8_3c_to_numpy(cv::Mat& input) {
     
     
     
    py::array_t<unsigned char> dst = py::array_t<unsigned char>({ input.rows,input.cols,3}, input.data);
     
    return dst;
     
    }
     
     
     
     
     
     
     
    //PYBIND11_MODULE(cv_mat_warper, m) {
     
    //
     
    // m.doc() = "OpenCV Mat -> Numpy.ndarray warper";
     
    //
     
    // m.def("numpy_uint8_1c_to_cv_mat", &numpy_uint8_1c_to_cv_mat);
     
    // m.def("numpy_uint8_1c_to_cv_mat", &numpy_uint8_1c_to_cv_mat);
     
    //
     
    //
     
    //}
     
     

    Python调用

     
     
    import cv2
     
    import matplotlib.pyplot as plt
     
    import demo11.cv_demo1 as cv_demo1
     
    import numpy as np
     
     
     
     
     
    image_rgb = cv2.imread('F:\\lena\\lena_rgb.jpg', cv2.IMREAD_UNCHANGED)
     
    image_gray = cv2.imread('F:\\lena\\lena_gray.jpg', cv2.IMREAD_UNCHANGED)
     
     
     
    var1 = cv_demo1.test_rgb_to_gray(image_rgb)
     
    print(var1.shape)
     
    plt.figure('rgb-gray')
     
    plt.imshow(var1, cmap=plt.gray())
     
     
     
    var2 = cv_demo1.test_gray_canny(image_gray)
     
    plt.figure('canny')
     
    plt.imshow(var2, cmap=plt.gray())
     
     
     
    var3 = cv_demo1.test_pyramid_image(image_gray)
     
    var3 = var3[1:]
     
    plt.figure('pyramid_demo')
     
    for i, image in enumerate(var3, 1):
     
    plt.subplot(2, 2, i)
     
    plt.axis('off')
     
    plt.imshow(image, cmap=plt.gray())
     
     
     
    plt.show()
     
     

    ref:

    Linux下编译安装OpenCV(基于C++,生成so库供python调用)

    https://blog.csdn.net/non_hercules/article/details/105095153

  • 相关阅读:
    python 判断返回结果 in用法
    关于requests的session方法保持不了cookie的问题。(seesion的意思是保持一个会话,比如 登陆后继续操作(记录身份信息) 而requests是单次请求的请求,身份信息不会被记录)
    python-selenium并发执行测试用例(方法一 各模块每一条并发执行)
    python 正则表达提取方法 (提取不来的信息print不出来 加个输出type 再print信息即可)
    unittest框架 assertEqual 报错 让其出现中文的方法(这个问题出现时 我找了老半天) 还追加了 报错信息自定义的方法
    python 指定文件编码的方法
    解决python中路径中包含中文无法找到文件的问题
    python 字符转换记录
    python-selenium 并发执行用例的问题
    深度影响价值
  • 原文地址:https://www.cnblogs.com/lidabo/p/16621356.html
Copyright © 2020-2023  润新知