首页 > 代码精文 > C/C++ > opencv-cvInRange,cvInRangeS,cvInvert and cvMahalonobis
2016
10-30

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\t",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\t",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

最后编辑:
作者:小企鹅
坚持+积累+学习
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

留下一个回复