opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

本章内容:


1.  cornerEigenValsAndVecs 角点特征值,特征向量计算
2.  cornerMinEigenVal 角点最小特征值计算
3.  preCornerDetect 角点赫森矩阵行列式

 

 

1.角点特征值、特征向量计算

 

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

输出结果:

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

2. 角点最小特征值计算

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

输出结果

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

 

3. 角点赫森矩阵行列式

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

输出结果

opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式

 

源码


#include <ostream>
#include <opencv.hpp>
#include <math.h>

int main(int argc, char *argv[])
{
    /*
     本章内容:
        1.  cornerEigenValsAndVecs 角点特征值,特征向量计算
        2.  cornerMinEigenVal 角点最小特征值计算
        3.  preCornerDetect 角点赫森矩阵行列式
    */
    cv::String fileName = "/home/wang/dev/Image/board.png";
//    cv::String fileName = "/home/wang/dev/Image/c10.tif";
    cv::Mat src = cv::imread(fileName);
//    cv::Mat src1 = cv::imread(fileName1);
    cv::Mat src1;
    cv::Mat src2;
    src1 = src.clone();
    src2 = src.clone();
    if(src.data == NULL){
        printf("图像读入失败\n");
        return -1;
    }
    cv::imshow("src",src);
    /*  角点特征值,特征向量计算
     * api接口: CV_EXPORTS_W void cornerEigenValsAndVecs( InputArray src, OutputArray dst,
                                          int blockSize, int ksize,
                                          int borderType = BORDER_DEFAULT );
        @param dst : Mat<Vec6f>: lamda1,lamda2,x1,y1,x2,y2

    @sa  cornerMinEigenVal, cornerHarris, preCornerDetect
    */
    cv::Mat gray;
    cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
    cv::Mat conners(src.size(),CV_32FC(6)); // 自定义多通道
    cv::cornerEigenValsAndVecs(gray,conners,3,3);
    std::vector<cv::Mat> MatVec;
    cv::split(conners,MatVec);
    std::cout << "chnnels = " << MatVec.size() << std::endl;
    cv::imshow("lambda1",MatVec[0]*10);
    cv::imshow("lambda2",MatVec[1]*10);
//    std::cout << conners << std::endl;

    /* 2.角点最小特征值计算
     * api接口:CV_EXPORTS_W void cornerMinEigenVal( InputArray src, OutputArray dst,
                                     int blockSize, int ksize = 3,
                                     int borderType = BORDER_DEFAULT );
    */
    cv::Mat dstVal;
    cv::cornerMinEigenVal(gray,dstVal,2);
    cv::normalize(dstVal,dstVal,1,0,cv::NORM_L2);
    cv::imshow("dstVal",dstVal*255);

    /*3. 角点赫森矩阵行列式
        api接口: CV_EXPORTS_W void preCornerDetect( InputArray src, OutputArray dst, int ksize,
                                   int borderType = BORDER_DEFAULT );
    */
    cv::Mat dstD;
    cv::preCornerDetect(gray,dstD,3);
    cv::normalize(dstD,dstD,1,0,cv::NORM_L2);
    cv::imshow("dstD",dstD*255);

    cv::waitKey(0);
    return 1;
}