zoukankan      html  css  js  c++  java
  • 《学习opencv》笔记——矩阵和图像操作——cvInRange,cvInRangeS,cvInvert and cvMahalonobis


    矩阵和图像的操作


    (1)cvInRange函数

    其结构


    void cvInRange(//提取图像中在阈值中间的部分
    	const CvArr* src,//目标图像
    	const CvArr* lower,//阈值下限
    	const CvArr* upper,//阈值上限
    	CvArr* dst//结果图像
    );

    实例代码


    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    
    int main() 
    { 
    	IplImage *src1,*src2,*dst11,*dst12,*dst13,*dst21,*dst22,*dst23;
    	src1=cvLoadImage("5.jpg");
    	src2=cvLoadImage("7.jpg");
    	dst11 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    	dst12 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    	dst13 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    	dst21 = cvCreateImage(cvSize(src2->width, src1->height), IPL_DEPTH_8U, 1);
    	dst22 = cvCreateImage(cvSize(src2->width, src1->height), IPL_DEPTH_8U, 1);
    	dst23 = cvCreateImage(cvSize(src2->width, src1->height), IPL_DEPTH_8U, 1);
    	cvSplit(src1, dst11, dst12, dst13, 0);
    	cvSplit(src2, dst21, dst22, dst23, 0);
    	
    	cvInRange(dst12,dst21,dst23,dst23);
    	cvShowImage( "原图", src1);
    	cvShowImage("过滤图",src2);
    	cvShowImage( "结果图", dst23);
    
    	cvWaitKey();
    	return 0;
    }

    输出结果




    (2)cvInRangeS函数

    其结构


    void cvInRangeS(//提取图像中在阈值中间的部分
    	const CvArr* src,//目标图像
    	CvScalar lower,//阈值下限
    	CvScalar upper,//阈值上限
    	CvArr* dst//结果图像
    );
    

    实例代码


    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    
    int main() 
    { 
    	IplImage *src1,*src2,*dst11,*dst12,*dst13,*dst21,*dst22,*dst23;
    	src1=cvLoadImage("5.jpg");
    	dst11 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    	dst12 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    	dst13 = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1);
    
    	CvScalar cs1;
    	cs1.val[0] = 0;
    	cs1.val[1] = 0;
    	cs1.val[2] = 0;
    	cs1.val[3] = 0;
    	CvScalar cs2;
    	cs2.val[0] = 80;
    	cs2.val[1] = 0;
    	cs2.val[2] = 0;
    	cs2.val[3] = 0;
    
    	cvSplit(src1, dst11, dst12, dst13, 0);
    
    	cvInRangeS(dst11,cs1,cs2,dst13);
    	cvShowImage( "原图", src1);
    	cvShowImage( "变单通过程图", dst11);
    	cvShowImage( "结果图", dst13);
    
    	cvWaitKey();
    	return 0;
    }

    输出结果




    (3)cvInvert函数

    其结构


    double cvInvert(//矩阵取逆
    	const CvArr* src,//目标矩阵
    	CvArr* dst,//结果矩阵
    	int method = CV_LU//逆运算方法
    );

    当中method有


    方法的參数值 含义
    CV_LU 高斯消去法
    CV_SVD 神秘值分解
    CV_SVD_SYM 对称矩阵的SVD

    实例代码


    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    
    int main() 
    { 
    		double a[3][3] = 
    		{    
    			{1,0,0},
    			{0,2,0},
    			{0,0,3}
    		};
    
    		CvMat va = cvMat(3,3, CV_64FC1,a);
    
    		cout<<"目标矩阵:"<<endl;
    
    		for(int i=0;i<3;i++)
    		{
    			for(int j=0;j<3;j++)
    				printf("%f	",cvmGet(&va,i,j));
    			cout << endl;
    		}
    
    
    		cvInvert(&va,&va);
    
    		cout << "其逆矩阵为:";
    		cout<<endl;
    		for(int i=0;i<3;i++)
    		{
    			for(int j=0;j<3;j++)
    				printf("%f	",cvmGet(&va,i,j));
    			cout << endl;
    		}
    		getchar();
    		return 0;
    	
    }

    输出结果




    (4)cvMahalonobis函数

    其结构


    CvSize cvMahalonobis(//计算马氏距离
    	const CvArr* vec1,//样本向量
    	const CvArr* vec2,//平均值
    	CvArr* mat//协方差的逆
    );

    ps:关于什么是马氏向量,我也研究了半天,找了一些资料算是弄明确了个大概。

            关于马氏距离,定义的话自己百度百科即可。

    关于理解和解释请參照博客:点击打开链接 通俗易懂

    关于以下的代码实例的数据来源:点击打开链接


    实例代码


    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    int main() 
    { 
    		double a1[4] = {3,4,5,6};
    		double a2[4] = {2,2,8,4};
    		
    		double b[4] = {2.5, 3, 6.5, 5};
    
    		double c[4][4] =
    		{
    				{0.25,0.50,-0.75,0.50},
    				{0.50,1.00,-1.50,1.00},
    				{-0.75,-1.50,2.25,-1.50},
    				{0.50,1.00,-1.50,1.00}
    	     };
    		CvMat va1 = cvMat(1,4, CV_64FC1,a1);
    		CvMat va2 = cvMat(1,4, CV_64FC1,a2);
    		CvMat vb = cvMat(1,4, CV_64FC1,b);
    		CvMat vc = cvMat(4,4, CV_64FC1,c);
    
    		cvInvert(&vc,&vc,CV_SVD); //协方差取逆,这个函数前面讲过
    
    		double r1 = cvMahalanobis(&va1,&vb,&vc);
    		double r2 = cvMahalanobis(&va2,&vb,&vc);
    		cout << "样本1的马氏距离:"<<endl;
    		cout<<r1<<endl;
    		cout << "样本2的马氏距离:"<<endl;
    		cout<<r2<<endl;
    		
    		getchar();
    		return 0;	
    }



    输出实例



    to be continued

  • 相关阅读:
    如何在Dynamics CRM 2011 的窗体表单上加载报表
    .Net程序员面试所需要的一些技术准备
    javascript常用数组算法总结
    jquery技巧总结
    《将博客搬至CSDN》
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    jQuery编程的最佳实践
    SQL 存储过程、触发器
    T--SQL基本编程(变量的定义、变量的赋值/取值,分支语句,循环语句)
    SQL server表连接
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3780536.html
Copyright © 2011-2022 走看看