【问题标题】:OpenCV: Why create multiple Mat objects to transform an image's format?OpenCV:为什么要创建多个 Mat 对象来转换图像的格式?
【发布时间】:2015-08-21 04:31:32
【问题描述】:

我有一段时间没有使用 OpenCV,所以请耐心等待我的初学者问题。在浏览 OpenCV 教程和示例代码时,我好奇地想到了一些东西。

为什么人们在进行多次转换时会创建多个 Mat 图像?这是一个例子:

Mat mat, gray, thresh, equal;
mat = imread("E:/photo.jpg");
cvtColor(mat, gray, CV_BGR2GRAY);
equalizeHist(gray, equal);
threshold(equal, thresh, 50, 255, THRESH_BINARY);

仅使用 两个 Mat 图像的代码示例:

Mat mat, process; 
mat = imread("E:/photo.jpg");
cvtColor(mat, process, CV_BGR2GRAY);
equalizeHist(process, process);
threshold(process, process, 50, 255, THRESH_BINARY);

这两个例子有什么不同吗?另外,还有一个初学者的问题:OpenCV 在只创建两个 Mat 图像时会运行得更快,还是还是一样?

提前谢谢你。

【问题讨论】:

  • 使用更多不同的垫子可能更适合测试新东西和调试,并且可能会提供更易于阅读的代码。但第二个可能会更有效率。
  • 但是:请注意,例如 cvtColor(input, input, code) 之类的方法对于多次调用将是低效的,因为它们不是就地操作并且必须分配临时数据。

标签: c++ opencv image-processing


【解决方案1】:

问题归结为,您是否还需要稍后在代码中使用非均衡图像?如果您想进一步处理灰度图像,那么第一个选项更好。如果没有,则使用第二个选项。

某些功能可能无法就地工作;具体来说,通过改变矩阵的维度(例如copyMakeBorder)或通道数(例如cvtColor)将矩阵转换为不同格式的矩阵。

对于您的用例,两个代码块执行相同数量的计算,因此速度根本不会改变。第二种选择显然更节省内存。

【讨论】:

    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 2017-07-15
    • 2020-09-15
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多