Python如何调用C++传递numpy数据
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要为大家展示了"Python如何调用C++传递numpy数据",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Python如何调用C++传递nump
千家信息网最后更新 2025年11月13日Python如何调用C++传递numpy数据
这篇文章主要为大家展示了"Python如何调用C++传递numpy数据",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Python如何调用C++传递numpy数据"这篇文章吧。
1.C++ 代码
Demo.h
#pragma oncevoid GeneratorGaussKernel(int ksize, float sigma, float* kernel);void LeftAndRightMirrorImageUInt8(unsigned char* in, unsigned char* out, int width, int height);void LeftAndRightMirrorImageFloat(float* in, float* out, int width, int height);void UpAndDownMirrorImageFloat(float* in, float* out, int width, int height);void UpAndDownMirrorImageUInt8(unsigned char* in, unsigned char* out, int width, int height);void ImageFilterFloat(float* in, float* out, int width, int height, float* filterKernel, int kw, int kh);void SaltAndPepperFloat(float* in, float* out, int width, int height, float minV, float maxV, float proportion);void SaltAndPepperUInt8(unsigned char* in, unsigned char* out, int width, int height, float minV, float maxV, float proportion);void ImageMinMax(float* in, int width, int height, int channels, float* minV, float* maxV);void ImageMinMax(unsigned char* in, int width, int height, int channels, unsigned char* minV, unsigned char* maxV);void ImageMulAAddBFloatFloat(float* in, float* out, int width, int height, int channels, float A, float B);void ImageMulAAddBUInt8UInt8(unsigned char* in, unsigned char* out, int width, int height, int channels, float A, float B);void ImageMulAAddBUInt8Float(unsigned char* in, float* out, int width, int height, int channels, float A, float B);void NormalizeUInt8Float(unsigned char* in, float* out, int width, int height, int channels, int type);void NormalizeFloatFloat(float* in, float* out, int width, int height, int channels, int type);void RGBAvgUInt8Float(unsigned char* in, float* out, int width, int height);void RGBAvgFloatFloat(float* in, float* out, int width, int height);
Demo.cpp
#include#include #include #include #include #include #include #include "omp.h"class ImageCoord {public: ImageCoord() { x = 0; y = 0; } ImageCoord(const ImageCoord& coord) { x = coord.x; y = coord.y; } ImageCoord(int x, int y) { this->x = x; this->y = y; } void operator= (ImageCoord& coord) { x = coord.x; y = coord.y; } int x, y;};class Random {public: Random() { srand((unsigned int)time(NULL)); } ImageCoord RandomImageCoord(int width, int height) { ImageCoord ans; ans.x = rand() % width; ans.y = rand() % height; return ans; } bool RandomBoolean() { return rand() % 2 == 1; }};static Random gRandom;void GeneratorGaussKernel(int ksize, float sigma, float* kernel){ int bufferSize = ksize * ksize; float sigmasigma2 = 2.0f * sigma * sigma; float sigmasigma2Inv = 1.f / sigmasigma2; float sigmasigma2PIInv = sigmasigma2Inv / 3.14159265358979f; int radius = ksize / 2; float sum = 0.f; for (int i = -radius; i <= radius; ++i) { for (int j = -radius; j <= radius; ++j) { kernel[(i + radius) * ksize + (j + radius)] = sigmasigma2PIInv * expf(-(i * i + j * j) * sigmasigma2Inv); } } for (int i = 0; i < bufferSize; ++i) { sum += kernel[i]; } sum = 1.f / sum; for (int i = 0; i < bufferSize; ++i) { kernel[i] = kernel[i] * sum; }}void LeftAndRightMirrorImageUInt8(unsigned char* in, unsigned char* out, int width, int height){ for (int i = 0; i < height; ++i) { int hoffset = i * width; for (int j = 0; j < width; ++j) { int woffset = (hoffset + j) * 3; int woffset_ = (hoffset + width - 1 - j) * 3; for (int n = 0; n < 3; ++n) { out[woffset_ + n] = in[woffset + n]; } } }}void LeftAndRightMirrorImageFloat(float* in, float* out, int width, int height){ for (int i = 0; i < height; ++i) { int hoffset = i * width; for (int j = 0; j < width; ++j) { int woffset = (hoffset + j) * 3; int woffset_ = (hoffset + width - 1 - j) * 3; for (int n = 0; n < 3; ++n) { out[woffset_ + n] = in[woffset + n]; } } }}void UpAndDownMirrorImageFloat(float* in, float* out, int width, int height){ int lineOffset = width * 3; int lineSize = lineOffset * sizeof(float); float* outTmp = out + lineOffset * height - lineOffset; float* inTmp = in; for (int i = 0; i < height; ++i) { memcpy_s(outTmp, lineSize, inTmp, lineSize); outTmp -= lineOffset; inTmp += lineOffset; }}void UpAndDownMirrorImageUInt8(unsigned char* in, unsigned char* out, int width, int height){ int lineOffset = width * 3; int lineSize = lineOffset * sizeof(unsigned char); unsigned char* outTmp = out + lineOffset * height - lineOffset; unsigned char* inTmp = in; for (int i = 0; i < height; ++i) { memcpy_s(outTmp, lineSize, inTmp, lineSize); outTmp -= lineOffset; inTmp += lineOffset; }}#if 0void Conv(float* in, float* out, int width, float* filter, int ksize) { int lineSize = width * 3; float* inTemp = in; float* outTemp = out; out[0] = 0.f; out[1] = 0.f; out[2] = 0.f; for (int i = 0; i < ksize; ++i) { for (int j = 0; j < ksize; ++j) { int xoffset = j * 3; out[0] += (*filter) * inTemp[xoffset + 0]; out[1] += (*filter) * inTemp[xoffset + 1]; out[2] += (*filter) * inTemp[xoffset + 2]; filter++; } inTemp = inTemp + lineSize; }}void ImageFilterFloat(float* in, float* out, int width, int height, float* filterKernel, int kw, int kh){ size_t size = (size_t)width * (size_t)height * sizeof(float) * 3; int startX = kw / 2; int endX = width - kw / 2; int startY = kh / 2; int endY = height - kh / 2; float* tempOut = out + (startY * width + startX) * 3; memset(out, 0, size); //memcpy_s(out, size, in, size); omp_set_num_threads(32);#pragma omp parallel for for (int i = 0; i <= height - kh; ++i) { int yoffset = i * width * 3; for (int j = 0; j <= width - kw; ++j) { int xoffset = yoffset + j * 3; Conv((in + xoffset), (tempOut + xoffset), width, filterKernel, kw); } }}#elif 1void Conv(float* in, float* out, int width, __m128* filter, int ksize) { int lineSize = width * 3; float* inTemp = in; float* outTemp = out; out[0] = 0.f; out[1] = 0.f; out[2] = 0.f; __m128 sum = _mm_set_ps1(0.f); for (int i = 0; i < ksize; ++i) { for (int j = 0; j < ksize; ++j) { int xoffset = j * 3; __m128 img_value = _mm_set_ps(1.f, inTemp[xoffset + 2], inTemp[xoffset + 1], inTemp[xoffset + 0]); sum = _mm_add_ps(_mm_mul_ps((*filter), img_value), sum); filter++; } inTemp = inTemp + lineSize; } out[0] = sum.m128_f32[0]; out[1] = sum.m128_f32[1]; out[2] = sum.m128_f32[2];}void ImageFilterFloat(float* in, float* out, int width, int height, float* filterKernel, int kw, int kh){ size_t size = (size_t)width * (size_t)height * sizeof(float) * 3; int startX = kw / 2; int endX = width - kw / 2; int startY = kh / 2; int endY = height - kh / 2; float* tempOut = out + (startY * width + startX) * 3; memset(out, 0, size); __m128* filterKernel_m128 = (__m128*)_mm_malloc(kw * kh * sizeof(__m128), sizeof(__m128)); for (int i = 0; i < kw * kh; ++i) { filterKernel_m128[i] = _mm_set_ps1(filterKernel[i]); } omp_set_num_threads(32);#pragma omp parallel for for (int i = 0; i <= height - kh; ++i) { int yoffset = i * width * 3; for (int j = 0; j <= width - kw; ++j) { int xoffset = yoffset + j * 3; Conv((in + xoffset), (tempOut + xoffset), width, filterKernel_m128, kw); } } if (filterKernel_m128) { _mm_free(filterKernel_m128); filterKernel_m128 = NULL; }}#endifvoid SaltAndPepperFloat(float* in, float* out, int width, int height, float minV, float maxV, float proportion){ int coordNumber = (int)(width * height * proportion); if (in != out) { memcpy_s(out, width * height * 3 * sizeof(float), in, width * height * 3 * sizeof(float)); } for (int i = 0; i < coordNumber; ++i) { ImageCoord coord = gRandom.RandomImageCoord(width, height); bool saltOrPepper = gRandom.RandomBoolean(); float value = saltOrPepper ? minV : maxV; int x = coord.x; int y = coord.y; int offset = (y * width + x) * 3; for (int c = 0; c < 3; ++c) { out[offset + c] = value; } }}void SaltAndPepperUInt8(unsigned char* in, unsigned char* out, int width, int height, float minV, float maxV, float proportion){ int coordNumber = (int)(width * height * proportion); if (in != out) { memcpy_s(out, width * height * 3 * sizeof(unsigned char), in, width * height * 3 * sizeof(unsigned char)); } for (int i = 0; i < coordNumber; ++i) { ImageCoord coord = gRandom.RandomImageCoord(width, height); bool saltOrPepper = gRandom.RandomBoolean(); float value = saltOrPepper ? minV : maxV; int x = coord.x; int y = coord.y; int offset = (y * width + x) * 3; for (int c = 0; c < 3; ++c) { out[offset + c] = (unsigned char)value; } }}void ImageMinMax(float* in, int width, int height, int channels, float* minV, float* maxV){ float minValue = 99999.f; float maxValue = -minValue; int number = width * height * channels; for (int i = 0; i < number; ++i) { float value = in[i]; if (value > maxValue) { maxValue = value; } if (value < minValue) { minValue = value; } } *minV = (float)minValue; *maxV = (float)maxValue;}void ImageMinMax(unsigned char* in, int width, int height, int channels, unsigned char* minV, unsigned char* maxV){ int minValue = 256; int maxValue = -1; int number = width * height * channels; for (int i = 0; i < number; ++i) { int value = in[i]; if (value > maxValue) { maxValue = value; } if (value < minValue) { minValue = value; } } *minV = (unsigned char)minValue; *maxV = (unsigned char)maxValue;}void ImageMulAAddBFloatFloat(float* in, float* out, int width, int height, int channels, float A, float B){ int size = width * height * channels; for (int i = 0; i < size; ++i) { out[i] = in[i] * A + B; }}void ImageMulAAddBUInt8UInt8(unsigned char* in, unsigned char* out, int width, int height, int channels, float A, float B){#define ALVACLAMP(x, minV, maxV) \ (x) < (minV) ? (minV) : ((x) > (maxV) ? (maxV) : (x)) int size = width * height * channels; for (int i = 0; i < size; ++i) { out[i] = (unsigned char)(ALVACLAMP(in[i] * A + B, 0, 255)); }#undef ALVACLAMP}void ImageMulAAddBUInt8Float(unsigned char* in, float* out, int width, int height, int channels, float A, float B){ int size = width * height * channels; for (int i = 0; i < size; ++i) { out[i] = in[i] * A + B; }}void NormalizeUInt8Float(unsigned char* in, float* out, int width, int height, int channels, int type){ unsigned char minV, maxV; ImageMinMax(in, width, height, channels, &minV, &maxV); int size = width * height * channels; float inv = 1.f / (maxV - minV); float offset = 0.f; if (type == 1) { inv *= 2.f; offset = -1.f; } for (int i = 0; i < size; ++i) { out[i] = (in[i] - minV) * inv + offset; }}void NormalizeFloatFloat(float* in, float* out, int width, int height, int channels, int type){ float minV, maxV; ImageMinMax(in, width, height, channels, &minV, &maxV); int size = width * height * channels; float inv = 1.f / (maxV - minV); float offset = 0.f; if (type == 1) { inv *= 2.f; offset = -1.f; } for (int i = 0; i < size; ++i) { out[i] = (in[i] - minV) * inv + offset; }}void RGBAvgUInt8Float(unsigned char* in, float* out, int width, int height){ int size = width * height; for (int i = 0; i < size; ++i) { float avg = (in[i * 3 + 0] + in[i * 3 + 1] + in[i * 3 + 2]) / 3.f; out[i * 3 + 0] = avg; out[i * 3 + 1] = avg; out[i * 3 + 2] = avg; }}void RGBAvgFloatFloat(float* in, float* out, int width, int height){ int size = width * height; for (int i = 0; i < size; ++i) { float avg = (in[i * 3 + 0] + in[i * 3 + 1] + in[i * 3 + 2]) / 3.f; out[i * 3 + 0] = avg; out[i * 3 + 1] = avg; out[i * 3 + 2] = avg; }}static PyObject* GeneratorGaussKernel(PyObject* self, PyObject* args) { //int ksize, float sigma, float* kernel PyObject* pyobj_filter = NULL; int ksize; float sigma; int ret = PyArg_ParseTuple(args, "Oif", &pyobj_filter, &ksize, &sigma); PyArrayObject* oarr = (PyArrayObject*)pyobj_filter; float* data = (float*)(oarr->data); GeneratorGaussKernel(ksize, sigma, data); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* LeftAndRightMirrorImageUInt8(PyObject* self, PyObject* args) { PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); unsigned char* dataOut = (unsigned char*)(oarr_out->data); LeftAndRightMirrorImageUInt8(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result; //std::cout << "";}static PyObject* LeftAndRightMirrorImageFloat(PyObject* self, PyObject* args) { PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); LeftAndRightMirrorImageFloat(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* UpAndDownMirrorImageUInt8(PyObject* self, PyObject* args) { PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); unsigned char* dataOut = (unsigned char*)(oarr_out->data); UpAndDownMirrorImageUInt8(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* UpAndDownMirrorImageFloat(PyObject* self, PyObject* args) { PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); UpAndDownMirrorImageFloat(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* ImageFilterFloat(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, float* filterKernel, int kw, int kh PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; PyObject* pyobj_filterKernel = NULL; int width, height; int kw, kh; int ret = PyArg_ParseTuple(args, "OOiiOii", &pyobj_img, &pyobj_out_img, &width, &height, &pyobj_filterKernel, &kw, &kh); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; PyArrayObject* kernel = (PyArrayObject*)pyobj_filterKernel; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); float* filter = (float*)(kernel->data); ImageFilterFloat(dataIn, dataOut, width, height, filter, kw, kh); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* SaltAndPepperFloat(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, float minV, float maxV, float proportion PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; float minV, maxV, proportion; int ret = PyArg_ParseTuple(args, "OOiifff", &pyobj_img, &pyobj_out_img, &width, &height, &minV, &maxV, &proportion); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); SaltAndPepperFloat(dataIn, dataOut, width, height, minV, maxV, proportion); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* SaltAndPepperUInt8(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, float minV, float maxV, float proportion PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; float minV, maxV, proportion; int ret = PyArg_ParseTuple(args, "OOiifff", &pyobj_img, &pyobj_out_img, &width, &height, &minV, &maxV, &proportion); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); unsigned char* dataOut = (unsigned char*)(oarr_out->data); SaltAndPepperUInt8(dataIn, dataOut, width, height, minV, maxV, proportion); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* ImageMulAAddBFloatFloat(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, int channels, float A, float B PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height, channels = 3; float A, B; int ret = PyArg_ParseTuple(args, "OOiiff", &pyobj_img, &pyobj_out_img, &width, &height, &A, &B); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); ImageMulAAddBFloatFloat(dataIn, dataOut, width, height, channels, A, B); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* ImageMulAAddBUInt8Float(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, int channels, float A, float B PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height, channels = 3; float A, B; int ret = PyArg_ParseTuple(args, "OOiiff", &pyobj_img, &pyobj_out_img, &width, &height, &A, &B); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); float* dataOut = (float*)(oarr_out->data); ImageMulAAddBUInt8Float(dataIn, dataOut, width, height, channels, A, B); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* ImageMulAAddBUInt8UInt8(PyObject* self, PyObject* args) { //float* in, float* out, int width, int height, int channels, float A, float B PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height, channels = 3; float A, B; int ret = PyArg_ParseTuple(args, "OOiiff", &pyobj_img, &pyobj_out_img, &width, &height, &A, &B); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); unsigned char* dataOut = (unsigned char*)(oarr_out->data); ImageMulAAddBUInt8UInt8(dataIn, dataOut, width, height, channels, A, B); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* NormalizeUInt8Float(PyObject* self, PyObject* args) { // unsigned char* in, float* out, int width, int height, int channels, int type PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height, channels = 3; int type; int ret = PyArg_ParseTuple(args, "OOiii", &pyobj_img, &pyobj_out_img, &width, &height, &type); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); float* dataOut = (float*)(oarr_out->data); NormalizeUInt8Float(dataIn, dataOut, width, height, channels, type); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* NormalizeFloatFloat(PyObject* self, PyObject* args) { // unsigned char* in, float* out, int width, int height, int channels, int type PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height, channels = 3; int type; int ret = PyArg_ParseTuple(args, "OOiii", &pyobj_img, &pyobj_out_img, &width, &height, &type); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); NormalizeFloatFloat(dataIn, dataOut, width, height, channels, type); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* RGBAvgUInt8Float(PyObject* self, PyObject* args) { // unsigned char* in, float* out, int width, int height PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; unsigned char* dataIn = (unsigned char*)(oarr->data); float* dataOut = (float*)(oarr_out->data); RGBAvgUInt8Float(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyObject* RGBAvgFloatFloat(PyObject* self, PyObject* args) { // unsigned char* in, float* out, int width, int height PyObject* pyobj_img = NULL; PyObject* pyobj_out_img = NULL; int width, height; int ret = PyArg_ParseTuple(args, "OOii", &pyobj_img, &pyobj_out_img, &width, &height); PyArrayObject* oarr = (PyArrayObject*)pyobj_img; PyArrayObject* oarr_out = (PyArrayObject*)pyobj_out_img; float* dataIn = (float*)(oarr->data); float* dataOut = (float*)(oarr_out->data); RGBAvgFloatFloat(dataIn, dataOut, width, height); PyObject* result = PyUnicode_FromFormat("result:%s", "ok"); return result;}static PyMethodDef DemoMethods[] = { {"LeftAndRightMirrorImageUInt8", (PyCFunction)LeftAndRightMirrorImageUInt8, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"LeftAndRightMirrorImageFloat", (PyCFunction)LeftAndRightMirrorImageFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"UpAndDownMirrorImageUInt8", (PyCFunction)UpAndDownMirrorImageUInt8, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"UpAndDownMirrorImageFloat", (PyCFunction)UpAndDownMirrorImageFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"ImageFilterFloat", (PyCFunction)ImageFilterFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"SaltAndPepperFloat", (PyCFunction)SaltAndPepperFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"SaltAndPepperUInt8", (PyCFunction)SaltAndPepperUInt8, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"ImageMulAAddBFloatFloat", (PyCFunction)ImageMulAAddBFloatFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"ImageMulAAddBUInt8Float", (PyCFunction)ImageMulAAddBUInt8Float, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"ImageMulAAddBUInt8UInt8", (PyCFunction)ImageMulAAddBUInt8UInt8, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"NormalizeUInt8Float", (PyCFunction)NormalizeUInt8Float, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"NormalizeFloatFloat", (PyCFunction)NormalizeFloatFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"RGBAvgUInt8Float", (PyCFunction)RGBAvgUInt8Float, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"RGBAvgFloatFloat", (PyCFunction)RGBAvgFloatFloat, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {"GeneratorGaussKernel", (PyCFunction)GeneratorGaussKernel, METH_VARARGS | METH_KEYWORDS, "I guess here is description." }, {NULL, NULL, 0, NULL}};static struct PyModuleDef demoModule = { PyModuleDef_HEAD_INIT, "mirror", NULL, -1, DemoMethods};PyMODINIT_FUNCPyInit_ImgProcessing(void) { // ImgProcessing 为生成的dll名称 return PyModule_Create(&demoModule);}
2.Python 代码
把C++ 编译出的ImgProcessing.dll 改为 ImgProcessing.pyd 并 拷贝到Python工程下
# -*- coding:utf-8 -*-import cv2import randomimport numpy as npimport ImgProcessing as augclass AugmentImagesBase: def _gauss(self, x, y, sigma=1.): Z = 2 * np.pi * sigma ** 2 kernel_value = 1 / Z * np.exp(-(x ** 2 + y ** 2) / 2 / sigma ** 2) return kernel_value def _gauss_kernel(self, kwidth, kheight, kchannel=1): kernels = np.zeros((kheight, kwidth, kchannel, 1), np.float32) mid = np.floor(kwidth / 2) for kernel_idx in range(kchannel): for i in range(kheight): for j in range(kwidth): kernels[i, j, kernel_idx, 0] = self._gauss(i - mid, j - mid) if kchannel == 1: kernels = np.reshape(kernels, (kheight, kwidth)) return kernels def left_right_flip(self, img_in, img_out, width=336, height=192): aug.AlvaLeftAndRightMirrorImageUInt8(img_in, img_out, width, height) return img_out def up_down_flip(self, img_in, img_out, width=336, height=192): aug.AlvaUpAndDownMirrorImageUInt8(img_in, img_out, width, height) return img_out def filtering(self, img_in, img_out, width=336, height=192, kernel=None, kwidth=3, kheight=3): aug.AlvaImageFilterFloat(img_in, img_out, width, height, kernel, kwidth, kheight) return img_out def pepper_salt(self, img_in, img_out, width=336, height=192, min_v=0, max_v=255, proportion=0.1): rand_proportion = random.uniform(0., proportion) aug.AlvaSaltAndPepperUInt8(img_in, img_out, width, height, min_v, max_v, rand_proportion) return img_out def contrast(self, img_in, img_out, width=336, height=192, a=0.6, b=0.4): aug.AlvaImageMulAAddBUInt8UInt8(img_in, img_out, width, height, a, b) return img_out def average_rgb(self, img_in, img_out, width=336, height=192): img_in = img_in.astype(np.float32) img_out = img_out.astype(np.float32) aug.AlvaRGBAvgFloatFloat(img_in, img_out, width, height) img_out = img_out.astype(np.uint8) return img_out def normalize(self, img_in, img_out, width=336, height=192, type=1): aug.AlvaNormalizeUInt8Float(img_in, img_out, width, height, type) return img_out def normal(self, img_in, img_out): return img_in def rota_180(self, img_in, img_out): return cv2.rotate(img_in, cv2.ROTATE_180) def rand_aug(self, img_in): img_in = np.asarray(img_in, dtype=np.uint8) img_out = np.ones_like(img_in).astype(np.uint8) aug_func = { "left_right_flip": self.left_right_flip, 'up_down_flip': self.up_down_flip, 'pepper_salt': self.pepper_salt, 'contrast': self.contrast, 'average_rgb': self.average_rgb, "normal": self.normal, "rota_180": self.rota_180, } img_out_curr = np.ones_like(img_in[0]).astype(np.uint8) aug_names = [] for i in range(img_in.shape[0]): aug_name = random.sample(list(aug_func.keys()), 1)[0] img_out_curr = aug_func[aug_name](np.squeeze(img_in[i]), img_out_curr) img_out[i] = img_out_curr aug_names.append(aug_name) return img_out, aug_namesdef image_aug(img_path): import cv2 import time aug_tools = AugmentImagesBase() kernel = aug_tools._gauss_kernel(5, 5) img_in = cv2.imread(img_path).astype(np.float32) img_out = np.ones_like(img_in).astype(np.float32) time1 = time.time() for i in range(1000): # img_out, aug_names = aug_tools.average_rgb(img_in, img_out) img_out = aug_tools.filtering(img_in, img_out, kernel=kernel, kwidth=5, kheight=5) time2 = time.time() print("end time:", time2 - time1) # cv2.imshow(aug_names[0], img_out[0]) cv2.imshow("aug img", img_out.astype(np.uint8)) cv2.imshow('src img', img_in.astype(np.uint8)) cv2.waitKey(0)if __name__ == "__main__": img_path = r"G:\20210917\img\1.jpg" image_aug(img_path)PyArg_ParseTuple 的使用见:PyArg_ParseTuple
以上是"Python如何调用C++传递numpy数据"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
C++
数据
内容
篇文章
代码
学习
帮助
名称
工程
拷贝
易懂
更多
条理
知识
编带
行业
资讯
资讯频道
频道
utf-8
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
博途的web服务器能干啥
云基础服务器生命周期管理
《数据库技术及应用教程》
罗湖区防尘的服务器机柜
深圳自动点胶软件开发
橡果网络技术发展有限公司
网络安全政治经济
首都网络安全鈤口号
服务器上更改ntp配置
网络技术三级题目有哪些
宽带服务器的用途
如何远程备份数据库
如何开多版本服务器
2018年学校网络安全计划
SQL两个数据库复制
对淘宝网络安全的建议
信息网络安全定级备案
泰隆银行app服务器异常
数据库冗余字段出现在哪
服务器上运行软件
万方数据库属于什么索引
威讯云电脑服务器地址大全
浙江计算机网络技术排名
分布式数据库发展
混乱服务器号我的世界手机版7月
oracle数据库重命名
智慧城市软件开发前景
传奇盾服务器
广东省强网杯网络安全大赛赛题
服务器主机