opencv 特征检测(二) 角点特征值,特征向量计算,角点赫森矩阵行列式
本章内容:
1. cornerEigenValsAndVecs 角点特征值,特征向量计算
2. cornerMinEigenVal 角点最小特征值计算
3. preCornerDetect 角点赫森矩阵行列式
1.角点特征值、特征向量计算
输出结果:
2. 角点最小特征值计算
输出结果
3. 角点赫森矩阵行列式
输出结果
源码
#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;
}