Moravec角点检测

2023-12-19 15:08
文章标签 检测 角点 moravec

本文主要是介绍Moravec角点检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <opencv2\opencv.hpp>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"/**********************************************************************************
*函数 int getMoravec(IplImage* src,CvSeq* corners)
*输入:
*src : 单通道图像
*corners : 用来保存提取到的角点
*threshold : 角点量的阈值 (具体函数 请看视频)
*输出
*corners : 用来保存提取到的角点
*返回值
*角点的个数
***************************************************************************************/
int getMoravec(IplImage* src,CvSeq* corners , float threshold)
{//窗口大小const int winSize=5; int x,y,halfWinSize=winSize/2;//保存最小的变化量IplImage* diffDst = cvCreateImage(cvGetSize(src),32,1);cvZero(diffDst);//保存角点个数int cornersCount=0;//1.计算图像上每一个点上的 在4个方向上的变化量 并计算出最小值 保存在矩阵diffDst中for(y=halfWinSize;y<src->height-halfWinSize;y++){for(x=halfWinSize;x<src->width-halfWinSize;x++){//compute the reaction in the four directions(0,45,90,135)int winx;//数组reaction[4] 用于保持 在四个方向上的灰度值变化量 //minValue用于保存4个变化量中的最小值float reaction[4],minValue;reaction[0]=0;reaction[1]=0;reaction[2]=0;reaction[3]=0;//提示  下面的4个循环 可以综合成一个循环//0 度方向的变化量保存在reaction[0]中for( winx=-halfWinSize;winx<halfWinSize;winx++){reaction[0] = reaction[0] + pow( cvGetReal2D(src,y,x+winx)-cvGetReal2D(src,y,x+winx+1), 2 );}//45 度方向的变化量保存在reaction[1]中for( winx=-halfWinSize;winx<halfWinSize;winx++){reaction[1] = reaction[1]+pow(cvGetReal2D(src,y+winx,x+winx)-cvGetReal2D(src,y+winx+1,x+winx+1),2);}//90 度方向的变化量保存在reaction[2]中for( winx=-halfWinSize;winx<halfWinSize;winx++){reaction[2] = reaction[2]+pow(cvGetReal2D(src,y+winx,x)-cvGetReal2D(src,y+winx+1,x),2);}//135 度方向的变化量保存在reaction[3]中for( winx=-halfWinSize;winx<halfWinSize;winx++){reaction[3] = reaction[3]+pow(cvGetReal2D(src,y+winx,x-winx)-cvGetReal2D(src,y+winx+1,x-winx-1),2);}//计算4个量中最小值  保存到minValueminValue = reaction[0];minValue = minValue > reaction[1] ? reaction[1] : minValue;minValue = minValue > reaction[2] ? reaction[2] : minValue;minValue = minValue > reaction[3] ? reaction[3] : minValue;//将最小的变化量保存到矩阵cvSetReal2D(diffDst,y,x,minValue);}}//2.获取角点坐标for(y=halfWinSize;y<src->height-halfWinSize;){for(x=halfWinSize;x<src->width-halfWinSize;){float max=0;int flag = 0 ;CvPoint maxLoc;maxLoc.x = -1;maxLoc.y = -1;//首先计算以点(x,y)位中心的winSize*winSize的窗口内部的局部极大值for(int winy=-halfWinSize;winy<=halfWinSize;winy++){for(int winx=-halfWinSize;winx<=halfWinSize;winx++){float value ;value = cvGetReal2D(diffDst,y+winy,x+winx);//计算该窗口内 最大值 保存到max 并保存其坐标到maxLocif(value>max){max = value;maxLoc.x = x+winx;maxLoc.y = y+winy;flag = 1;}}}//如果找到局部极大值 并且该值大于预先设定的阈值 则认为是角点if(flag==1 && max>threshold){cvSeqPush(corners,&maxLoc);cornersCount++;	}//下一个窗口x=x+halfWinSize;}//下一行的第一个窗口y=y+halfWinSize;}cvReleaseImage(&diffDst);return cornersCount;
}int main(int argc, char* argv[])
{IplImage* src;//加载源图像src = cvLoadImage("3.jpg",CV_LOAD_IMAGE_GRAYSCALE);if(!src){printf("图像加载失败");}//用于保存最终角点的空间CvMemStorage* mem = cvCreateMemStorage(0);//角点将会保存在一个CvSeq中CvSeq* corners;corners = cvCreateSeq(0,sizeof(CvSeq),sizeof(CvPoint),mem);//角点的个数int cornersCount;//调用函数getMoravec计算角点cornersCount = getMoravec(src,corners,25000);//图像show用于显示角的提取结果IplImage* show= cvCreateImage(cvGetSize(src),8,3);cvCvtColor(src,show,CV_GRAY2BGR);//获取每一个角点的坐标for(int x=0;x<cornersCount;x++){CvPoint* pt = (CvPoint*)cvGetSeqElem(corners,x);//以角点坐标为中心  绘制一个半径为5的圆cvCircle(show,*pt,10,cvScalar(255,0,0,0));}//显示结果cvNamedWindow("dst");cvShowImage("dst",show);cvWaitKey(0);cvReleaseImage(&src);cvReleaseImage(&show);cvReleaseMemStorage(&mem);return 0;
}


运算结果:



角点的数量取决于所设定的阈值的大小。

阈值越小,角点数量越多,精度越低~

【1】moravec角点检测步骤:
(1)对于每一个像素点,计算在E(u,v),在我们的算法中,(u,v)的取值是((1,0), (1,1), (0,1), (-1, 1).当然,你自己可以改成(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1) 8种情况
(2)计算最小值对每个位置minValue = min{E(u,v)},其中(u,v) = (1,0), (1,1), (0,1), (-1, 1).

(计算每个像素点的兴趣值, 即以该像素点为中心, 取一个w*w(如:5x5)的方形窗口, 计算0度、45度、90度、135度四个方向灰度差的平方和, 取其中的最小值作为该像素点的兴趣值。)
(3)对每个位置minValue 进行判断,是不是大于设定阈值,如果是大于设定阈值,接着判断是不是局部极大值


【2】Moravec角点检测算法原理
Moravec角点检测算法是最早的角点检测算法之一。该算法将角点定义为具有低“自相关性”的点。算法会检测图像的每一个像素,将像素周边的一个邻域作为一个patch,并检测这个patch和周围其他patch的相关性。这种相关性通过两个patch间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。
如果像素位于平滑图像区域内,周围的patch都会非常相似。如果像素在边缘上,则周围的patch在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。而如果像素是各个方向上都有变化的特征点,则周围所有的patch都不会很相似。
Moravec会计算每个像素patch和周围patch的SSD最小值作为强度值,取局部强度最大的点作为特征点。




这篇关于Moravec角点检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/512662

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

Android模拟器的检测

Android模拟器的检测 需求:最近有一个需求,要检测出模拟器,防止恶意刷流量刷注册。 1.基于特征属性来检测模拟器,比如IMSI,IDS,特殊文件等等。 这个方案局限性太大,貌似现在大部分模拟器默认就是修改了的,还不需要人为的去修改。 经过测试,发现如下图所示。 如果是模拟器的话,这些特殊值应该返回true,比如DeviceIDS,Build。可是居然返回了false,说明特殊值