JavaCV转换颜色HSV2RGB非常慢

时间:2017-01-08 19:00:19

标签: android opencv image-processing javacv iplimage

我最近开始使用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一样快。可能的方法:

  • 查找CV_HSV2RGB是否还有另一个“等效”常量 更快
  • 直接访问H-S-V字节数组并进行自己的“快速”转换 在C.

欢迎任何解决此问题的想法

- 编辑 -

所有这一切都发生在小型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个通道

0 个答案:

没有答案