【OpenCV学习笔记】【函数学习】四(origin+imageData+cvcopy()函数+CvMemStorage 类型+CvPoint类型)

来源:互联网 发布:经济学博士申请 知乎 编辑:程序博客网 时间:2024/05/21 07:32

1.origin

      在使用opencv显示图像时会出现图像倒立的情况,这与IplImage的origin属性有关系。origin为0表示顶左结构,即图像的原点是左上角,如果为1为左下角。

      一般从硬盘读入的图片或者通过cvCreateImage方法创建的IplImage图片默认的origin为0,即显示的时候都是正的。

     而由摄像头或者视频文件获取的帧图像origin为1,此时显示的时候扫描顺序是从下到上,显示也是正的(opencv显示的时候是根据origin的值显示的,如果origin=1,则从下到上显示,否则反之)。

      但是如果你自己创建了一个IplImage格式的图像img,且从帧图像中copy或者截取一部分区域进行显示的时候就会出现倒立情况。这是因为cvCreateImage方法得到的img的origin是0,而帧图像的origin为1,它会将帧图像的第i行赋值给img的第height-i行,因此就出现了倒立.解决办法是:在创建之后将origin调整为与帧图像的origin一致即可。

         IplImage* face=cvCreateImage(cvSize(width,height),copy_Frame->depth,copy_Frame->nChannels);

        //因为IplImage的origin=0,所以要先将face->origin改为1
        face->origin=copy_Frame->origin;//1

以前总是不知道为什么,从摄像头录入的视频帧,显示在窗口上很正常,但是用来进行数据计算时总要先垂直翻转一下。为此,在涉及图像中坐标的计算中,出过不少错。

        现在终于明白了,OpenCV中的图像结构有个很重要的成员origin,它指明了图像的原点位置可以有两种取值:IPL_ORIGIN_TL和IPL_ORIGIN_BL,其中TL意思是:TopLeft,即左上;BL意思是:BottomLeft,即左下。其实这两个都是整形常量,IPL_ORIGIN_TL就是0,IPL_ORIGIN_BL就是1。

        经验证,从摄像头取回的图像的坐标原点是在左下角,即origin值是1。所以在计算前,一定要明确图像的坐标原点位置,否则就会出错。《学习OpenCV中文版》49页也特别强调了:计算机视觉领域,一个重要的错误来源就是原点位置的定义不统一。


二 imageData

ImageData指向存储图像数据的一块数据区。这块数据区虽然是被声明为char类型的,但是其也可以引用其他类型的数据。

例如声明一个图像,长宽为100,100,深度为32位的float型,灰度图像。

IplImage* Img = cvCreateImage(cvSize(100,100), IPL_DEPTH_32F, 1);

那么我们可以通过调试查看实际的内存分配空间为40000 = 100*100*(32/8)。也就是说实际上是分配了10000个float型的内存区域。

三cvcopy()函数

拷贝一个数组给另一个数组   
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );   
src 输入数组。  
dst 输出数组。   
mask 操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。   
函数cvCopy从输入数组中复制选定的成分到输出数组:   如果mask(I)!=0,则dst(I)=src(I)。   如果输入输出数组中的一个是IplImage类型的话,其ROI和COI将被使用。输入输出数组必须是同样的类型、维数和大小(这一点需要特别注意)函数也可以用来复制散列数组(这种情况下不支持mask)。

转自:http://www.360doc.com/content/14/0219/10/15868697_353734375.shtml

四、CvMemStorage 类型

五:CvPoint类型





0 0