opencv(3)矩阵和图像的操作

1opencv中矩阵和图像可以用相同的函数进行操作,主要包含以下几种类型:

操作函数

大致将每种类型列出表格,对重要的函数进行说明

1:copy add

void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );

复制数据,如果图像设置了ROI,就会使用ROI

void cvSet( CvArr* arr, CvScalar value, const CvArr* mask=NULL );

设置数组为指定值

void cvSetZero( CvArr* arr );

清空数组

void cvRange( CvArr* mat, double start, double end );

必须指向单通道32位,arr(i,j)=(end-start)*(i*cols(arr)+j)/(cols(arr)*rows(arr))

2:变化和置换

void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0);

垂直或者水平翻转,flip_mode = 0 沿X-轴翻转, flip_mode > 0 (如 1) 沿Y-轴翻转, flip_mode < 0 (如 -1) 沿X-轴和Y-轴翻转

void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,
CvArr* dst2, CvArr* dst3 );

分割多通道数组成几个单通道数组或者从数组中提取一个通道 ,应用:彩色图像分割出HSV分量

void cvMerge( const CvArr* src0, const CvArr* src1,
const CvArr* src2, const CvArr* src3, CvArr* dst );

从几个单通道数组组合成多通道数组或插入一个单通道数组

void cvCvtColor( const CvArr* src, CvArr* dst, int code );

色彩空间变换,用的比较多,灰度变换,HSV变换等

void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );

图像大小变换,可以使用CV_INTER_NN - 最近邻插值,
CV_INTER_LINEAR - 双线性插值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..CV_INTER_CUBIC - 立方插值.

这几个函数在图像处理中都比较常用,比如:

HSV

3.算术逻辑

算术逻辑

 

4.统计

统计

 

5.线性代数

统计
一般算数运算

就总结这么多了先,对这些画个小时时间,至少脑子里面系统了一些哈,给出我自己写的双摄像机的标定程序(opencv中已经使用另外一个函数实现):其实公式很简单,如下:

image

 

opencv的实现如下:

    sys_Rotion_array.RemoveAll() ;    
    sys_Trans_array.RemoveAll();   
    for( CurrentImage=0 ; CurrentImage < sys_ImgChessPram.ImageNum ; CurrentImage++)
    {
      cvGetRow(sys_CalibratePram_cur.rotation_vectors,temp_Vector,CurrentImage);   //获取1*3旋转向量
      cvRodrigues2(temp_Vector,temp_cur_Rotion_Max,0);                             //转换为3*3旋转矩阵

      cvGetRow(sys_CalibratePram_other.rotation_vectors,temp_Vector,CurrentImage); 
      cvRodrigues2(temp_Vector,temp_other_Rotion_Max,0);                           

      cvGetRow(sys_CalibratePram_cur.translation_vectors,temp_cur_trans_Vector,CurrentImage); //获取1*3平移向量
      cvGetRow(sys_CalibratePram_other.translation_vectors,temp_other_trans_Vector,CurrentImage); //获取1*3平移向量

      CvMat  *temp_sys_rotion  = cvCreateMat(3,3,CV_32FC1);  
      CvMat  *temp_sys_trans   = cvCreateMat(1,3,CV_32FC1);  

      GetSysParam(temp_cur_Rotion_Max,temp_cur_trans_Vector,temp_other_Rotion_Max,temp_other_trans_Vector,temp_sys_rotion,temp_sys_trans );

      sys_Rotion_array.Add(temp_sys_rotion) ;      //添加到序列中
      sys_Trans_array.Add(temp_sys_trans);   
    }

    cvSetZero(temp_Rotion_Max_Sum);
    cvSetZero(temp_trans_Vector_Sum);

    for( CurrentImage=0 ; CurrentImage < sys_ImgChessPram.ImageNum ; CurrentImage++)
    {
      cvAdd(temp_Rotion_Max_Sum , sys_Rotion_array.GetAt(CurrentImage),temp_Rotion_Max_Sum);
      cvAdd(temp_trans_Vector_Sum , sys_Trans_array.GetAt(CurrentImage),temp_trans_Vector_Sum);
    }

    cvMul(temp_Rotion_Max_Sum ,div_r_mat,m_MedLeftRotionMax);
    cvMul(temp_trans_Vector_Sum,div_t_mat,m_MedLeftTranstionMax);


 

posted @ 2012-06-04 17:26  RubbyZhang  阅读(872)  评论(0编辑  收藏  举报