这是一个类似这样的功能:
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
结束时会被销毁。这将捕获异常。
答案 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()