gpt4 book ai didi

用于大图像处理的 python memap 或 pybuffer

转载 作者:行者123 更新时间:2023-11-28 06:50:39 25 4
gpt4 key购买 nike

我想为 C++ 库编写一个 Python 包装器。我想要的部分是一个 C++ 图像对象到一个 numpy 数组。我最初的想法是使用 Python C API 和 SWIG 生成绑定(bind)创建一个 PyBuffernumpy.frombuffer 然后可以处理实际保存图像的 pybuffer。到目前为止,一切都很好。但是当我读到 python.memap 时,事情发生了变化,我想知道使用 python.memap C 对象而不是 PyBuffer 是个不错的选择对象?

这里的优缺点是什么?。由 C++ 库处理的图像可能会非常大。举个例子~4GB。

最佳答案

根据要求,一个最小的例子根据 SciPy' Cookbook :

tst.i 文件是 SWIG 接口(interface)文件,其中已经包含用于动态分配 100 个 doubles 的 C++ 代码。还实现了将数组内容打印到 stdout 的函数:

%module(docstring="A Simple Numpy Memview example") tstI

%{
#define SWIG_FILE_WITH_INIT
// Her comes the C-code:
#include<iostream>
double *x = NULL;
void __call_at_begining() {
std::cout << "__call_at_begining() ..." << std::endl;
x = new double(100);
for(int i=0; i<100;i++) // fill x with some values
x[i] = i*10;
}
void __call_at_end(void) {
std::cout << "__call_at_end() ..." << std::endl;
if (x != NULL)
free(x);
}

// The interface for the memory view:
void view_x(double** d, int* d_n) {
*d = x;
*d_n = 100;
}
// dump context to stdout:
void print_x() {
std::cout << "x = ";
for(int i=0; i<100;i++)
std::cout << x[i] << " ";
std::cout << std::endl;
}
%}


%include "numpy.i"


%init %{
import_array();
__call_at_begining();
%}

%inline %{
void finalize(void) {
__call_at_end();
}
%}

// This is the SWIG magic:
%apply (double** ARGOUTVIEW_ARRAY1, int *DIM1) {(double** d, int* d_n)}
// Here's the Interface decalartion for Python:
void view_x(double** d, int* d_n); // SWIG declaration
void print_x();

我喜欢Cmake ,所以这是一个最小的 CMakeLists.txt 文件,用于使用 SWIG(在 Debian Sid 下测试),使用 cmake 构建。make:

# This is a CMake example for Python
cmake_minimum_required(VERSION 2.8)

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})

FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} )
SET(CMAKE_SWIG_FLAGS "")

SET_SOURCE_FILES_PROPERTIES(tstI.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(tstI.i PROPERTIES SWIG_FLAGS "-includeall")
SWIG_ADD_MODULE(tstI python tstI.i )
SWIG_LINK_LIBRARIES(tstI ${PYTHON_LIBRARIES})

在以下使用包装器的示例 Python session 中:

In [1]: import numpy as np

In [2]: import tstI # loads module
__call_at_begining() ...

In [3]: y = tstI.view_x() # get memory view

In [4]: y[:10]
Out[4]: array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.])

In [5]: y[:10] = np.zeros(10)

In [6]: tstI.print_x() # dump memory contents
x = 0 0 0 0 0 0 0 0 0 0 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260
270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490
500 510 520 530 540 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720
730 740 750 760 770 780 790 800 810 820 830 840 850 860 870 880 890 900 910 920 930 940
950 960 970 980 990

关于用于大图像处理的 python memap 或 pybuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24010906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com