糟糕的问题标题,我知道,抱歉。
我有一小段代码,这些代码非常低效且速度慢,并且被大量调用:
// 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的新手(并非想要重新发明轮子或写脆弱的)代码还没有。
对于那些可能感兴趣的人,我正在为每个像素编写一个基于时间的直方图,以便我可以检索任何我喜欢的分位数(例如,中间像素的帧,按时间,或第一个四分位数......)。 )我可能已经忽略了一种更好的方法来做到这一点。代码有效,它比我希望的慢得多。
提前感谢任何指示! (建议类型的指针,而不是其他类型,但也欢迎它们。)
答案 0 :(得分:0)
显而易见的解决方法是在转换之前对CV_8U进行数学运算。我也不会使用除法,而只是& 1
掩码。
但是,您必须了解OpenCV的便利是有代价的。你说&#34;额外的cv :: Mat&#34;但我更多:inc =(灰色&gt; i),inc32和inc32 / 255。