《学习opencv》笔记——矩阵和图像操作——cvSum,cvSVD,cvSVBkSb,cvTrace,cvTranspose,cvXor,cvXorS and...

矩阵和图像的操作

(1)cvSum函数

其结构

CvScalar cvSum(//计算arr各通道所有像素总和
  CvArr* arr//目标矩阵
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int main() 
{ 

  IplImage *src1,*dst1,*dst2,*dst3,*dst4;
  src1=cvLoadImage("3.jpg",1);
  
  CvScalar cs = cvSum(src1);

  cout << "通道一总和:";
  cout << cs.val[0] << endl;
  cout << "通道二总和:";
  cout << cs.val[1] << endl;
  cout << "通道三总和:";
  cout << cs.val[2] << endl;
  cout << "通道四总和:";
  cout << cs.val[3] << endl;

  getchar();
  return 0;
}
输出结果
 
(2)cvSVD函数
其结构
void cvSVD(//计算 A = U*W*(V的转置)
  CvArr* A,
  CvArr* W,
  CvArr* U = NULL,
  CvArr* V = NULL,
  int flags = 0//标记位
);
ps : flag参数的取值
参数 结果
CV_SVD_MODIFY_A 允许改变矩阵A
CV_SVD_U_T 返回U转置而不是U
CV_SVD_V_T 返回V转置而不是V
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main() 
{ 

  double a[5][5] = 
  {    
    {7,2,4,5,6},
    {3,4,5,8,2},
    {1,0,9,7,5},
    {0,5,3,2,1},
    {4,6,7,3,1}
  };

  CvMat va = cvMat(5,5, CV_64FC1,a);

  cout<<"目标矩阵:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&va,i,j));
    cout << endl;
  }

  double b[5][5] = {0};

  CvMat vb = cvMat(5,5, CV_64FC1,b);

  double c[5][5] = {0};

  CvMat vc = cvMat(5,5, CV_64FC1,c);

  double d[5][5] = {0};

  CvMat vd = cvMat(5,5, CV_64FC1,d);

  cvSVD(&va,&vb,&vc,&vd);


  cout<<"结果矩阵vb:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&vb,i,j));
    cout << endl;
  }

  cout<<"结果矩阵vc:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&vc,i,j));
    cout << endl;
  }

  cout<<"结果矩阵vd:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&vd,i,j));
    cout << endl;
  }

  getchar();
  return 0;

}
输出结果

(3)cvSVBkSb函数

其结构
void cvSVBKSb(//计算X=V*(W伴随)*(T转置)*B
  const CvArr* W,
  const CvArr* U,
  const CvArr* V,
  const CvArr* B,
  CvArr* X,
  int flage = 0//标记位
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main() 
{ 

  double a[5][5] = 
  {    
    {7,2,4,5,6},
    {3,4,5,8,2},
    {1,0,9,7,5},
    {0,5,3,2,1},
    {4,6,7,3,1}
  };

  CvMat va = cvMat(5,5, CV_64FC1,a);

  double b[5][5] = {0};

  CvMat vb = cvMat(5,5, CV_64FC1,b);

  double c[5][5] = {0};

  CvMat vc = cvMat(5,5, CV_64FC1,c);

  double d[5][5] = {0};

  CvMat vd = cvMat(5,5, CV_64FC1,d);

  cvSVD(&va,&vb,&vc,&vd);

  cvSVBkSb(&vb,&vc,&vd,NULL,&va,0);


  cout<<"结果矩阵:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&va,i,j));
    cout << endl;
  }

  getchar();
  return 0;

}
输出结果

(4)cvTrace函数
其结构
CvScalar cvTrace(//求矩阵的迹
  const CvArr* mat//目标矩阵
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main() 
{ 

  double a[5][5] = 
  {    
    {7,2,4,5,6},
    {3,4,5,8,2},
    {1,0,9,7,5},
    {0,5,3,2,1},
    {4,6,7,3,1}
  };

  CvMat va = cvMat(5,5, CV_64FC1,a);

  cout<<"目标矩阵:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&va,i,j));
    cout << endl;
  }

  CvScalar cs = cvTrace(&va);

  cout << " 矩阵的迹为:";
  cout << cs.val[0] << endl;

  getchar();
  return 0;

}
输出结果

(5)cvTranspose函数

其结构
void cvTranspose(//矩阵转置
  const CvArr* src,//目标矩阵
  CvArr* dst//结果矩阵
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main() 
{ 

  double a[5][5] = 
  {    
    {7,2,4,5,6},
    {3,4,5,8,2},
    {1,0,9,7,5},
    {0,5,3,2,1},
    {4,6,7,3,1}
  };

  CvMat va = cvMat(5,5, CV_64FC1,a);

  double b[5][5] = {0};
  
  CvMat vb = cvMat(5,5, CV_64FC1,b);

  cout<<"目标矩阵:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&va,i,j));
    cout << endl;
  }

  cvTranspose(&va,&vb);

  cout<<"结果矩阵:"<<endl;

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<5;j++)
      printf("%f\t",cvmGet(&vb,i,j));
    cout << endl;
  }

  getchar();
  return 0;

}
输出结果

(6)cvXor函数
其结构
void cvXor(//矩阵进行异或操作
  const CvArr* src1,//矩阵1
  const CvArr* src2,//矩阵2
  CvArr* dst,//结果矩阵
  const CvArr* mask = NULL//矩阵“开关”
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  IplImage *src1, *src2,*src3;
  src1 = cvLoadImage("1.jpg");
  src2 = cvLoadImage("11.jpg");
  src3 = cvLoadImage("7.jpg");

  cvXor(src1,src2,src3);

  cvShowImage( "测试1", src1);
  cvShowImage( "测试2", src2);
  cvShowImage( "测试3", src3);
  cvWaitKey();
  return 0;
}
输出结果

(7)cvXorS函数
其结构
void cvXor(//矩阵与给定值进行异或操作
  const CvArr* src1,//矩阵1
  CvScalar value//给定值
  CvArr* dst,//结果矩阵
  const CvArr* mask = NULL//矩阵“开关”
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  IplImage *src1, *src2;
  src1 = cvLoadImage("1.jpg");
  src2 = cvLoadImage("7.jpg");

  CvScalar cs;
  cs.val[0] = 100;
  cs.val[1] = 100;
  cs.val[2] = 255;
  cs.val[3] = 0;

  cvXorS(src1,cs,src2);

  cvShowImage( "测试1", src1);
  cvShowImage( "测试2", src2);
  cvWaitKey();
  return 0;
}
输出结果

(8)cvZero函数
其结构
void cvZero(//将图像所有通道设置为零
  CvArr* arr//目标图像
);
实例代码
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  IplImage *src1, *src2;
  src1 = cvLoadImage("1.jpg");
  src2 = cvLoadImage("1.jpg");

  cvZero(src1);

  cvShowImage( "结果图", src1);
  cvShowImage( "原图", src2);
  cvWaitKey();
  return 0;
}
输出结果
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值