每天学习的内容比较有限,希望都能有机会记录下来,毕竟自己记性不太好,可以反复翻来看看

一  关于Mat

这个一看名字就想起了Matlab,再看了下介绍,果然和矩阵有关系,关键的在下面,引用自OpenCV的tutorials:

”你不必再手动地(1)为其开辟空间(2)在不需要时立即将空间释放。但手动地做还是可以的:大多数OpenCV函数仍会手动地为输出数据开辟空间。当传递一个已经存在的Mat 对象时,开辟好的矩阵空间会被重用。也就是说,我们每次都使用大小正好的内存来完成任务。“--后面关于手动的说明不是很理解,估计还要在以后具体使用的时候再去理解。

 

”基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷贝 的图像,因为这会降低程序速度。"--从Mat定义,不难看出,如果单纯是赋值或者复制Mat的值,所指向的是内存的同一块地方,所以其中任何一个把内存数值改变了,那么所有的Mat所指向的内容就都改变了。不拷贝大的图像,这个要切记。下面是tutorials里面的一个例子:

opencv国内外研究现状 opencv tutorials_tutorials

这就是上面介绍的情况,A,B,C任何一个改变数值,另外的数值全都要改变。仍然要拷贝矩阵本身的话,就要是用函数clone()和copyTo(),这样就可以直接而不用担心原矩阵会被修改。

 

二 关于图像矩阵的存储

图像对应矩阵的大小与我们使用的图像模型有关,还是tutorials 里面的例子,灰度图像的存储如下:

opencv国内外研究现状 opencv tutorials_存储_02

而”而对多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等。例如,RGB颜色模型的矩阵:“

opencv国内外研究现状 opencv tutorials_tutorials_03

总算知道OpenCv一些函数里面的通道数的意思了,不过具体还是要去多使用才可以理解。”注意到,子列的通道顺序是反过来的:BGR而不是RGB。很多情况下,因为内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行。连续存储有助于提升图像扫描速度,我们可以使用isContinuous() 来去判断矩阵是否是连续存储的. 相关示例会在接下来的内容中提供。“ --tutorials里面的内容,不是很理解

 

三 关于掩码的计算

重新计算图像中每个像素的值,相当于”我们用自己设置的权值,对像素邻域内的值做了个加权平均“,至于加权平均的规则,这个就依赖于我们自己想实现什么样的结果了。另外,掩码和卷积是不是一回事呢?感觉计算方法是一样的

 

四 计算程序运行时间

”没错,OpenCV提供了两个简便的可用于计时的函数 getTickCount() 和 getTickFrequency() 。第一个函数返回你的CPU自某个事件(如启动电脑)以来走过的时钟周期数,第二个函数返回你的CPU一秒钟所走的时钟周期数“

opencv国内外研究现状 opencv tutorials_存储_04

需要计算某一部分的运行时间就可以这样去使用

 

五 关于cvWaitKey()

这个问题来自我运行OpenCV的samples里面代码的时候,原来的部分代码

opencv国内外研究现状 opencv tutorials_存储_05

本来是要把源图像和两个测试图像都输出的,但是只出现了两幅图片,而且,这个cvWaitKey(0)之后的代码没有运行。我自己小小改动了一下,出来了,

opencv国内外研究现状 opencv tutorials_delay_06

就在于我把cvWaitKey注释掉了,看了一个文章介绍如下:

cvWaitKey(int delay) 指延时delay ms的时间

delay<=0时,函数cvWaitKey无限制的等待按键事件,所以显示图像时,需要在cvShowImage("**.bmp",image)后加上cvWaitKey(n)——n为小于等于0的数即可,程序停在显示函数处,不运行其他代码;否则,图像无法正常显示。

 

这是为了图像的显式,那么涉及到视频呢,就是

delay>0时,延迟"delay"ms,在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待"delay"ms再显示下一帧视频;如果使用cvWaitKey(0)则只会显示第一帧视频。

返回值:被按键的值,如果超过指定时间则返回-1。
如果程序想响应某个按键,可利用if(cvWaitKey(1)==Keyvalue);


经常程序里面出现if( cvWaitKey(10) >= 0 ) 是说10ms中按任意键退出

 

今天就先写到这里,第一次写原创还是有点顾虑,思前想后才写了,主要还是自己初学,理解的比较浅薄,不过感觉自己写了一遍,也有理解了一遍,有利于加深印象,我觉得的这样的学习方法很好,我要坚持去做,加油!有不对的地方大家多多指正,我也可以尽快改正自己的错误!