最近对VP的数据协议进行了反思,昨天进行了重大改进,去掉了智能指针的使用,在模块内部使用了缓存区概念,既方便了内存管理又极大地提高了效率,性能检测结果对比如下:
改进之前:
改进之后:
上述所有的数字都以cpu时钟周期为单位。
运行结果还是不太满意,继续追踪各个模块的运行时间,结果大大出乎意料,从IplImage到QImage的转化函数居然这么耗时,性能检测结果如下:
注意其中的CvImage2QImage的执行时间。 跟踪那段函数代码,使用的两重循环执行图片的转化:
下面是改进的代码:
改进后的性能检测结果如下:
原因分析:
第一种情况要差不多23个时钟周期,然后第二个却只需要4个时钟周期,效率差距这么大。原因在于opencv中图片存储是按行存取,所以行优先处理可以更加符合程序的局部性原理。
尾声
对于一个实时性强的系统每秒处理几十帧,从一帧处理147个时钟周期到16个时钟周期。。。
一种更好的改进:
通过QImage和IplImage共享内存,需要注意的是,QT中的的图片是RGB格式,而OpenCV摄像头获得图片是BGR格式。具体实现代码如下:
经测试,对于640*480的帧图片,转化为qimage只需要五个时钟周期左右。
add: 2011/1/14 by RYF