如何使用独立函数中的数据返回cv :: Mat

时间:2018-08-04 16:29:34

标签: opencv

这是一个类似这样的功能:

cv::Mat func(const std::string& path) {
    cv::Mat img = cv::imread(path, CV_LOAD_IMAGE_GRAYSCALE);
    int n_col = img.cols;
    int n_row = img.rows;
    img.convertTo(result, CV_32F);
    float* data_in = (float*)img.data;

    do some computation...

    cv::Mat result = cv::Mat(n_row, n_col, CV_32FC1, data_in);
    return result;
}

主要功能:

int main(){
    ...
    cv::Mat result = func(path);
    cv::imwrite("result.bmp", result);
    ...
}

当此代码遇到 cv::imwrite("result.bmp", result);,它将捕获异常。我使用vs2013查看从func返回的结果,它不为空并且具有与img相同的尺寸。

有人可以帮助我确定我要去哪里吗?

有没有更好的方法来实现功能cv::Mat func(const std::string& path)

答案:cv::Mat result = cv::Mat(n_row, n_col, CV_32FC1, data_in);更改为cv::Mat result = cv::Mat(n_row, n_col, CV_32FC1, data_in).clone(); 有效

说明: 当我用float* data_in构造Mat时,OpenCV只是初始化指向指定数据的矩阵头,这意味着不复制任何数据

外部数据不会自动释放,但是在func结束时会被销毁。这将捕获异常。

1 个答案:

答案 0 :(得分:0)

尝试一下:

cv::Mat func(const std::string& path)
{
    cv::Mat img = cv::imread(path,CV_LOAD_IMAGE_GRAYSCALE);

do some computation...

    cv::Mat result;
    img.convertTo(result, CV_32F);

    return result;
}

如果要深度复制wn图像,请使用.clone()或.copyTo()