OpenCV cv :: Mat to short *(避免memcpy)

时间:2013-05-02 12:17:19

标签: c++ pointers opencv return memcpy

我有一个C ++函数,可以从别人的C#应用​​程序中调用。作为输入,我的函数被赋予一个有符号的短整数数组,它代表的图像的维度,以及为返回数据分配的内存,即另一个带符号的短整数数组。这将代表我的函数标题:

my_function (short* input, int height, int width, short* output)

在我的函数中,我从input创建一个cv :: Mat,如下所示:

cv::Mat mat_in = cv::Mat (height, width, CV_16S, input);

mat_in转换为CV_32F并由OpenCV的cv::bilateralFilter处理。在它返回cv :: Mat mat_out之后,我将数据转换回CV_16SbilateralFilter只接受CV_8UCV_32F)。现在我需要将此cv::Mat mat_out转换回一个短整数数组,以便它可以返回到调用函数。这是我的代码:

my_function (short* input, int height, int width, short* output)
{
    Mat mat_in_16S = Mat (height, width, CV_16S, input);

    Mat mat_in_32F = Mat (height, width, CV_32F);
    Mat mat_out_CV_32F = Mat (height, width, CV_32F);

    mat_in_16S.convertTo (mat_in_32F, CV_32F);

    bilateralFilter (mat_in_32F, mat_out_32F, 5, 160, 2);
    Mat mat_out_16S = Mat (mat_in_16S.size(), mat_in_16S.type());
    mat_out_32F.convertTo (mat_out_16S, CV_16S);

    return 0;
}

显然,最后我需要将mat_out_16S中的数据导入output。我的第一次尝试是返回一个参考:

output = &mat_out_16S.at<short>(0,0);

但当然我意识到这是一个愚蠢的想法,因为mat_out_16S一旦函数返回就超出范围,让output指向空虚。目前,我最好的尝试如下(来自this question):

memcpy ((short*)output, (short*)mat_out_16S.data, height*width*sizeof(short));

现在我想知道,有更好的方法吗?复制所有这些数据感觉有点低效,但我看不出我还能做些什么。不幸的是,我无法返回cv :: Mat。如果没有更好的方法,我目前的memcpy方法至少是安全的吗?我的数据都是2字节有符号的短整数,所以我认为填充不应该存在问题,但我不想遇到任何令人不快的意外。

1 个答案:

答案 0 :(得分:1)

您可以将此constructor用于mat_out_16S

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

所以你的功能将是:

my_function (short* input, int height, int width, short* output)
{
    Mat mat_in_16S = Mat (height, width, CV_16S, input);

    Mat mat_in_32F = Mat (height, width, CV_32F);
    Mat mat_out_CV_32F = Mat (height, width, CV_32F);

    mat_in_16S.convertTo (mat_in_32F, CV_32F);

    bilateralFilter (mat_in_32F, mat_out_32F, 5, 160, 2);
    Mat mat_out_16S = Mat (mat_in_16S.size(), mat_in_16S.type(), output);
    mat_out_32F.convertTo (mat_out_16S, CV_16S);

    return 0;
}