zoukankan      html  css  js  c++  java
  • IpIImage -> CvMat 转换方法

    Ipl转为CvMat 一般为这两种方法:

    1:

    /*cvGetMat*/
    CvMat matheader;
    CvMat * mat = cvGetMat(img, &matheader);
    

    2:

    /*cvConvert*/
    CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);
    cvConvert(img, mat)
    

    不过经过测试,感觉cvGetMat并不好用,因为需要多一步初始化matheader的步骤。麻烦。所以推荐方法

    -------------------------------------------------------------------------------------------------------------------

    方法2测试如下图所示,

    我们可以看到,如果声明不同的话——在cvCreateMat理,第三个参数:type,可以是任何预定义类型,预定义类型的结构如下:CV_<bit_depth> (S|U|F)C<number_of_channels>。于是,矩阵的元素可以是32位浮点型数据(CV_32FC1),或者是无符号的8位三元组的整型数据(CV_8UC3),或者是无数的其他类型的元素——那么mat的内部结构也就不同,从step来说,我的理解step是一行所占的内存空间,mat1是无符号3通道,即内部的数据类型应该是unsigned char,即占用1个字节每个单元,mat2则是float,4个字节每单元,也就是说mat2同等数据个数,其空间大小是mat1的四倍,这也正好由step验证。

    从ipl这一端来看,ipl的imageData数据类型为unsigned char*,那么如果把数据转到mat2中的话,则要涉及到一个强制转换,unsigned char 转为 float,按照常识,一般都是以强转为0收尾。所以为了ipl转mat成功,将type声明为CV_8UC3是必须的。

    三通道转换成功,便自然想到一通道的灰度图转换。

    其代码如下:实验证明,这是成功的。

    void ReadIpl2Mat()
    {
    	int temp1, temp2;
    	int row, col;
    
    	IplImage *img = cvLoadImage("11.jpg",1);
    	IplImage *pImgGray = cvCreateImage(cvGetSize(img), img->depth, 1);
    	uchar *pImg, *pMat;
    	CvMat *mat1;
    
    	cvCvtColor(img, pImgGray, CV_BGR2GRAY);
    	mat1 = cvCreateMat(pImgGray->height, pImgGray->width, CV_8UC1);	
    	cvConvert(pImgGray, mat1);	
    	
    	for ( row=0; row<mat1->rows; row++)
    	{
    		pImg = (char*)(pImgGray->imageData + row*pImgGray->widthStep);
    		pMat = (char*)(mat1->data.ptr + row*mat1->step);
    		for(col=0; col<mat1->cols; col++)
    		{
    			temp2 = *(pImg+col);
    			temp1 = *(pMat+col);
    		}
    	}
    }
    

      

  • 相关阅读:
    路径问题
    移动端推荐使用
    js获取各种宽高方法
    html 符号大全
    bzoj4923 K小值查询
    bzoj3781 小B的询问
    bzoj1799 [Ahoi2009]self 同类分布
    bzoj2005 [Noi2010]能量采集
    bzoj4039 集会
    bzoj2516 电梯
  • 原文地址:https://www.cnblogs.com/OleNet/p/3201536.html
Copyright © 2011-2022 走看看