OpenCV可以在浮点数上进行比较吗?或者可以通过其他方式提高效率?

时间:2016-05-24 07:33:56

标签: c++ opencv image-processing

糟糕的问题标题,我知道,抱歉。

我有一小段代码,这些代码非常低效且速度慢,并且被大量调用:

    // frequencies is a 256 element cv::Mat array, already with values
    // values in frequencies may exceed 255
    // grey is a cv::Mat, type CV_8U
    cv::Mat inc, inc32;

    for (int i = 0; i < 256; i++) {
        inc = (grey > i);   
        inc.convertTo(inc32, CV_32F);
        frequencies[i] = inc32/255 + frequencies[i];
    }

inc成为CV_8U类型,因为这是比较(或'&gt;')返回的,但我需要浮点1.0或0.0。所以我必须将它转换为inc32,然后除以255.这看起来非常低效和缓慢,因此没有真正的原因制作额外的cv :: Mat。

我尝试过添加元素,但这是一场灾难(大约慢了3倍)。

那么,有没有一种更有效的方法可以做到这一点,例如以某种方式使比较存储在浮点型Mat中为1.0?我正在考虑重新实现OpenCV比较以完成我需要的操作,或者可能是需要Mat连续的策略,但我是OpenCV的新手(并非想要重新发明轮子或写脆弱的)代码还没有。

对于那些可能感兴趣的人,我正在为每个像素编写一个基于时间的直方图,以便我可以检索任何我喜欢的分位数(例如,中间像素的帧,按时间,或第一个四分位数......)。 )我可能已经忽略了一种更好的方法来做到这一点。代码有效,它比我希望的慢得多。

提前感谢任何指示! (建议类型的指针,而不是其他类型,但也欢迎它们。)

1 个答案:

答案 0 :(得分:0)

显而易见的解决方法是在转换之前对CV_8U进行数学运算。我也不会使用除法,而只是& 1掩码。

但是,您必须了解OpenCV的便利是有代价的。你说&#34;额外的cv :: Mat&#34;但我更多:inc =(灰色&gt; i),inc32和inc32 / 255。