做一手机网站需要多少钱,手机怎么注册自己的网站,电子商务网站建设,网站板块的策划方案1.Harris角点介绍
什么是角点#xff1f; 角点指的是两条边的交点#xff0c;图中红色圈起来的点就是角点。 Harris角点检测原理#xff1a;首先定义一个矩形区域#xff0c;然后将这个矩形区域放置在我的图像中#xff0c;求取这个区域内所有的像素值之和#xff0c;之…1.Harris角点介绍
什么是角点 角点指的是两条边的交点图中红色圈起来的点就是角点。 Harris角点检测原理首先定义一个矩形区域然后将这个矩形区域放置在我的图像中求取这个区域内所有的像素值之和之后沿着多个方向移动我这个区域再次计算新区域的像素值之和如果移动前和移动后的像素值两者的差值比较小那么就不是Harris角点如果两者之间差值比较大就认定移动前覆盖的区域内存在Harris角点。
如图下图两条线形成角点而矩形区域分别表示平面、边界、角点三种位置 2.Harris角点计算
Harris角点检测原理当移动窗口窗口内像素值变化大就有Harris角点
Harris角点检测原理公式 权重系数的引入是为了更加方便地去确定某一个点是Harris角点。
Harris角点检测原理公式写成矩阵形式 由此可得出梯度协方差矩阵M Harris评价函数来测量每个像素的角点程度 与梯度协方差矩阵M相关 在这个公式中R是角点响应函数的值M是一个2x2的矩阵描述了局部区域中像素的梯度信息det(M)表示矩阵的行列式trace(M)表示矩阵的迹k是一个常数用于调节响应函数的敏感度。
Harris评价函数可以用特征向量来表示。λ1和λ2分别是M的两个特征值。 通过对特征值λ1和λ2进行求解我们可以计算Harris评价函数R并据此来判断像素是否为角点。
当λ1和λ2都较大且接近时表示图像局部区域存在角点。当λ1和λ2都比较小或者差异较大时表示图像局部区域是平坦或者边缘区域。
3.检测Harris角点函数cornerHarris() void cv::cornerHarris ( InputArray src, OutputArray dst, int blockSize, int ksize, double K, int borderType BORDER_DEFAULT src:待检测Harris角点的输入图像图像必须是CV 8U或者CV 32F的单通道灰度图像dst: 存放Harris评价系数的R矩阵数据类型为CV 32F的单通道图像与输入图像具有相同的尺寸blockSize:邻域大小ksize: Sobel算子的半径用于得到梯度信息 k:计算Harris评价系数R的权重系数borderType:像素外推算法标志
4.绘制角点函数drawKeypoints() void drawKeypoints(InputArray image, const std::vectorKeyPoint keypoints, OutputArray outImage, const Scalar color Scalar::all(-1), int flags DrawMatchesFlags::DEFAULT ) 参数说明 image: 输入图像可以是任意类型的Mat对象。 keypoints: vector类型的关键点每个关键点包含其在图像中的位置和其他信息如尺度、方向等。 outImage: 输出图像用于存储绘制了特征点的图像。可以与输入图像相同的尺寸和类型。 color: 绘制特征点的颜色可以是Scalar对象或CV_RGB(R, G, B)宏定义默认为Scalar::all(-1)表示随机颜色。 flags: 绘制标志用于控制绘制方式。可以是以下常量之一 DrawMatchesFlags::DEFAULT: 默认绘制方式显示关键点的位置和大小。 DrawMatchesFlags::DRAW_OVER_OUTIMG: 将关键点绘制在输出图像上而不是创建新的输出图像。 DrawMatchesFlags::DRAW_RICH_KEYPOINTS: 绘制丰富的特征点显示位置、尺度、方向等详细信息。
5.示例代码
void Harris_f(Mat image){//转成灰度图像Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);// 执行Harris角点检测Mat harris;cornerHarris(gray,harris,2,3,0.04);//归一化便于进行数值比较和结果显示Mat harrisn;normalize(harris,harrisn,0,255,NORM_MINMAX);//将图像的数据类型变成CV_8UconvertScaleAbs(harrisn,harrisn);//寻找Harris角点vectorKeyPoint keyPoints;for(int row0;rowharrisn.rows;row){for(int col0;colharrisn.cols;col){int Rharrisn.atuchar(row,col);if(R180){//将角点存入KeyPoint中KeyPoint keyPoint;keyPoint.pt.yrow;keyPoint.pt.xcol;keyPoints.push_back(keyPoint);}}}//绘制角点drawKeypoints(image,keyPoints,image,Scalar(0,0,255,255));//与显示结果imwrite(/sdcard/DCIM/harrisn.png,harrisn);imwrite(/sdcard/DCIM/result.png,image);
}系数矩阵 绘制Harris角点