下面是一个类似如下的函数:
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();
works!
Explaination:当我用float* data_in
构造Mat时,OpenCV只初始化指向指定数据的矩阵头,这意味着没有数据被复制。
外部数据不会自动释放,而是在func
结束时销毁。这将捕获异常。
发布于 2018-08-05 02:23:03
试试这个:
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()
https://stackoverflow.com/questions/51687536
复制相似问题