Python如何调用C++传递numpy数据
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要为大家展示了"Python如何调用C++传递numpy数据",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Python如何调用C++传递nump
千家信息网最后更新 2025年02月02日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安全错误
数据库的锁怎样保障安全
怎么把数据库字符集
数据库水平 垂直拆分
南京集团软件开发公司有哪些
sr550服务器怎么有20核
江西信息化软件开发供应
昆明中通服网络技术有限公司
互联网高科技酒店怎么改造
河南般若网络技术有限公司起诉
黎明大学计算机网络技术
网络安全技术分析 论文)
lol四川的服务器云主机
打开手抄报网络安全的写字内容
盐城网络安全领导
brad芸薹属数据库怎么用
三星服务器管理员
网络安全事件学生
2008 ca服务器搭建
广州智磊互联网科技有限公司
常德网络安全公司
临淄erp软件开发公司
数据库应用怎样消除数据
河南数据网络技术质量服务
软件开发缴税
qqext纯真ip数据库
江苏苏州公安局网络安全支队长
威海职业学院网络技术
网络安全杂志奖项
用来学软件开发电脑配置
软件开发企业研发支出账务
打印机共享服务器哪个牌子好