安装pybind11
方法1 源代码安装
git clone https://github.com/pybind/pybind11
cd pybind11 && mkdir build && cd build && cmake ..
make install #如果不可以,就 sudo make install
方法 2 直接使用pip 安装
写对应的 C++ 代码
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <unordered_map>
#include <iterator>
namespace py = pybind11;
struct MeshData { //自定义数据结构
std::vector<std::vector<double>> vertices;
std::vector<std::vector<double>> colors;
std::vector<std::vector<double>> vertices_norms;
std::vector<std::vector<int>> faces;
std::vector<int> sem;
std::unordered_map<int, std::string> color_map_str;
};
MeshData load_obj(const std::string& model_sem_path) {
std::ifstream fin(model_sem_path);
if (!fin.is_open()) {
throw std::runtime_error("Unable to open file: " + model_sem_path);
}
std::vector<std::vector<std::string>> fields_list;
std::vector<std::vector<double>> vertices;
std::vector<std::vector<double>> colors;
std::vector<std::vector<double>> vertices_norms;
std::vector<std::vector<int>> faces;
std::vector<int> sem;
std::unordered_map<int, std::string> color_map_str;
std::string line;0
while (std::getline(fin, line)) {
std::istringstream iss(line);
std::vector<std::string> fields(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>());
fields_list.push_back(fields);
if (fields[0] == "v") {
vertices.push_back({std::stod(fields[1]), std::stod(fields[2]), std::stod(fields[3])});
colors.push_back({std::stod(fields[4]), std::stod(fields[5]), std::stod(fields[6])});
sem.push_back(std::stoi(fields.back()));
int out_id = std::stoi(fields.back());
if (color_map_str.find(out_id) == color_map_str.end()) {
color_map_str[out_id] = fields[4] + ' ' + fields[5] + ' ' + fields[6];
}
} else if (fields[0] == "vn") {
vertices_norms.push_back({std::stod(fields[1]), std::stod(fields[2]), std::stod(fields[3])});
} else if (fields[0] == "f") {
faces.push_back({std::stoi(fields[1]) - 1, std::stoi(fields[2]) - 1, std::stoi(fields[3]) - 1});
}
}
MeshData model_data;
model_data.vertices = vertices;
model_data.colors = colors;
model_data.vertices_norms = vertices_norms;
model_data.faces = faces;
model_data.sem = sem;
model_data.color_map_str = color_map_str;
return model_data;
}
PYBIND11_MODULE(py2cpp, m) {
m.def("load_obj", &load_obj, "Load obj function");
py::class_<MeshData>(m, "MeshData")
.def(py::init<>())
.def_readwrite("vertices", &MeshData::vertices)
.def_readwrite("colors", &MeshData::colors)
.def_readwrite("vertices_norms", &MeshData::vertices_norms)
.def_readwrite("faces", &MeshData::faces)
.def_readwrite("sem", &MeshData::sem)
.def_readwrite("color_map_str", &MeshData::color_map_str);
}
编译代码
mkdir build
cd build
cmake ..
make
写 Python 代码
from build import py2cpp #导入对应的 so 文件
model_sem_path = "model.obj"
model_data = py2cpp.load_obj(model_sem_path)