巧用OpenCV计算图片序列(矩阵)的直方图

来源:互联网 发布:数控编程代码z代表什么 编辑:程序博客网 时间:2024/05/17 01:08

最近做课题的时候需要对压缩视频中运动向量幅值和相位做统计。一直以来都是都是采用OpenCV做图像处理和视频分析。自然而然的想到了calcHist这个函数。

通过查看函数API,欣然得发现,刚好有函数原型为:

       void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false );

以为这正是我要找的东西。然而通过尝试一番才发现,不能完成我想要的。虽然第一个参数传入的是图像指针,但是第二个参数即便是取大于1的数,结果还是仅仅统计一幅图像(严格地说是一个plane)。这不是我要的。而且,C++接口的Mat是一个类,平时很少用到Mat*。Mat 通常的使用方法都是得到引用,很少用指针。而我想要统计的多幅图像(或矩阵)也存储在vector<Mat> 中。本来想过调用Matlab,那里面的函数hist可以直接操作多维矩阵,不过还是不想因为这么一点小问题,就改变技术路线。于是采用了一个笨办法。自己写了一个函数对每一副图片进行统计,然后每次累加。结果还行,不过总是感觉不太爽。偌大一个OpenCV居然没有考虑到这一点?


最近几天刚好在网络上浏览技术博客时,偶尔发现了有人遇到相同的问题。http://www.cnblogs.com/tornadomeet/archive/2012/12/01/2797727.html

解决方法利用了calcHist最后一个参数accumlate,这样每次都自动的进行累加。比较巧妙。大笑


心得:

1.千万不要仅仅把OpenCV的Mat,当做图像来用,数值矩阵都已用来存储的。视野要开阔。

2.对于一些参数要好好把握,有时候一个小小的参数都会有很精妙的运用。

总之,君子性非异,善假于物也!