【发布时间】:2017-08-02 02:37:12
【问题描述】:
试图实现将图片从RGB转换为灰度的转换方法。 当我使用我的方法并在 ImageView 中显示渲染时,它会滞后很多,当我使用 OpenCV 库中的 cvtColor 函数时,它就像一个魅力。 谁能解释一下问题出在哪里? 这是我的方法:
public void RGBToGray(Mat m){
for(int i = 0; i < m.rows(); i++){
for(int j = 0; j < m.cols(); j++){
double[] pix = m.get(i, j);
pix[0] = pix[1] = pix[2] = (0.21)*pix[0]+(0.72)*pix[1]+(0.07)*pix[2];
m.put(i, j, pix);
}
}
}
【问题讨论】:
-
您缺乏 OpenCV 中
cvtColor实现的并行化和矢量化。最重要的是,每次迭代都有两个函数调用——IIRC 这将涉及 JNI,因此会产生一些相关的开销(如果不是每个图像一个调用,每个像素都有两个调用,那么就会变得更加明显。 -
您对
m.get和m.put的调用将消耗大量时间。请注意,ITU(国际电信联盟)将等式定义为Grey = 0.299Red + 0.587Green + 0.114Blue,根据我的经验,它非常有效。 -
真的,考虑到你使用的是
Mat,这个for循环没有什么理由。 OpenCV 提供了将Mat拆分为单个通道optimized operations to multiply wholeMatby a scalar 的方法,以及将它们相加并将通道合并为多通道Mat。 -
好的,所以避免 m.get 和 m.put 会解决它,但是如果没有这些功能,我将如何实现算法呢? ,我的意思是将一个垫子分成两个矩阵,应用一个比例然后合并它们,这些操作是如何工作的?不是通过for循环来修改每个像素吗?
标签: java opencv optimization colors lag