gpt4 book ai didi

c++ - 如何组合两个仅在声明的类型上不同的函数

转载 作者:行者123 更新时间:2023-11-30 02:48:20 24 4
gpt4 key购买 nike

我正在编写一个 mex 函数来从 FLI 相机中抓取图像。图像可以具有不同的位深度(8 位或 16 位),因此我不得不编写两个仅在声明的类型上有所不同的函数。我的问题:如何组合以下函数以尽可能多地消除代码重复?

mxArray* grabFrame16Bit(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
uint16_t *image = (uint16_t *) mxCalloc(imageSize, sizeof(uint16_t));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow");
}

mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}

mxArray* grabFrame8Bit(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
uint8_t *image = (uint8_t *) mxCalloc(imageSize, sizeof(uint8_t));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow"); }

mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}

如果您不熟悉 FLI API 或 MATLAB mex/mx API,这里是我编写的一个自定义函数以及其他 API 函数的声明。

// allocates memory
void *mxCalloc(mwSize n, mwSize size);

// checks for an error
void fli::checkReturn(long returnCode, char * errorId);

// grabs a row of the image
long FLIGrabRow(flidev_t device, void * buffer, size_t width);

// creates a double matrix
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity complexFlag);

// gives a pointer to the data in the matrix
double *mxGetPr(const mxArray *pm);

最佳答案

欢迎来到模板世界!

一种天真的方法是只替换所有出现的类型并将其替换为模板类型参数。

template <class T>
mxArray* grabFrame(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
T *image = (T*) mxCalloc(imageSize, sizeof(T));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow");
}

mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat[0]);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}

由于无法从函数参数中推断出模板参数的类型,因此您必须在每次调用时明确指定它:

mxArray* array = grabFrame<uint8_t>(device, width, height);

编辑:您的代码没有返回语句,所以我允许自己添加它。

关于c++ - 如何组合两个仅在声明的类型上不同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054991/

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