从IplImage到QImage的转化看性能优化

来源:互联网 发布:c 数组里面的数组 编辑:程序博客网 时间:2024/09/21 09:29

      最近对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