我最近开始使用Android进行相机预览图像处理的JavaCv。
基本上,我进行相机预览,进行一些处理,将其转换为HSV以修改某些颜色,然后我想将其转换为RGBA以填充位图。
一切正常,但速度很慢。为了找到最慢的部分我做了一些测量,我惊讶地发现了这一行:
cvCvtColor( hsvimage, imageBitmap, CV_HSV2RGB); //<-- 50msecs
其中 hsvimage 是3通道IplImage, imageBitmap 是4 channel.image。 (转换很好,并将alpha通道保留为255,按预期给出不透明的位图)
仅作比较,以下两行仅需3毫秒
cvCvtColor(yuvimage, bgrimage, CV_YUV2BGR_NV21);
cvCvtColor(bgrimage, hsvimage, CV_BGR2HSV);
( yuvimage 是1频道IplImage, bgrimage 和 hsvimage 是3频道IplImages)
似乎第一次转换(HSV2RGB)没有像其他转换那样优化。还使用3通道目标图像对其进行了测试,以防万一,但结果相同。
我想找到一种方法让它像BGR2HSV一样快。可能的方法:
欢迎任何解决此问题的想法
- 编辑 -
所有这一切都发生在小型320 * 240图像上并在小米Redmi Note 4上运行。大多数操作(例如将颜色从RGB转换为HSV)的时间不到1毫秒。 Canny需要5毫秒,Floodfill需要大约5或6毫秒。只有这种转换HSV2RGB会产生如此奇怪的结果。 将尝试直接使用OpenCV(而不是JavaCV)来查看此行为是否消失。
我使用的是旧的JavaCV版本(0.11)现在我已经更新到1.3并且结果几乎相同
...
long startTime=System.currentTimeMillis();
cvCvtColor(hsvimage, imageBitmap, CV_HSV2RGB);
Log.w(LOG_TAG, "Time:" + String.valueOf(System.currentTimeMillis() - startTime)); //<-- From 45 to 50msec
Log.w(LOG_TAG,"Channels:"+imageBitmap.nChannels()); // <-- returns 4
我可以使用结果填充32位/像素的android位图
Mat mim4C= new Mat(imageBitmap);
Mat mhsvimage = new Mat(hsvimage);
long startTime**strong text**=System.currentTimeMillis();
CvtColor(mhsvimage, mim4C, CV_HSV2RGB);
Log.w(LOG_TAG, "Time:" + String.valueOf(System.currentTimeMillis() - startTime)); //<-- From 45 to 50mse
IplImage iim4C=new IplImage(mim4C);
Log.w(LOG_TAG,"Channels:"+iim4C.nChannels()); // <-- returns 3!!!
在第二种情况下,如果我尝试填充一个32位/像素的android位图(在将mim4C转换回IplImage之后),它崩溃了,因为它有3个通道