// myextension.cpp
#include <pybind11/pybind11.h>
#include <opencv2/opencv.hpp>
// Some function that returns an OpenCV image object (cv::Mat)
cv::Mat get_image();
PYBIND11_MODULE(myextension, m) {
m.def("get_image", get_image);
pybind11::class_<cv::Mat>(m, "Image", pybind11::buffer_protocol())
.def_buffer([](cv::Mat& im) -> pybind11::buffer_info {
return pybind11::buffer_info(
// Pointer to buffer
im.data,
// Size of one scalar
sizeof(unsigned char),
// Python struct-style format descriptor
pybind11::format_descriptor<unsigned char>::format(),
// Number of dimensions
3,
// Buffer dimensions
{ im.rows, im.cols, im.channels() },
// Strides (in bytes) for each index
{
sizeof(unsigned char) * im.channels() * im.cols,
sizeof(unsigned char) * im.channels(),
sizeof(unsigned char)
}
);
});
}
std::size_t size = sizeof(unsigned char);
unsigned char val = data[(size * c * w) * i + (size * c) * j + size * k];
import numpy as np
import myextension
def get_image():
im = myextension.get_image()
return np.array(im, copy=False)
参考文章: