当前位置: 首页 > news >正文

OpenCV CornerHarris角点检测(C#)

原理:
用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

在这里插入图片描述

API:

public static void CornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, BorderTypes borderType = BorderTypes.Reflect101);

角点检测CornerHarris函数介绍:
1.src:必须是单通道8位或者32位浮点图像
2.dst:存储角点结果图像,它的格式是CV_32FC1,图像大小和原图大小一致
3.blockSize:扫描窗口的大小,ps:此值越大检测到的结果越多
4.ksize:Sobel算子的大小,四邻域、八邻域等,此值越大检测结果越多
5.k:此值是个经验值一般只用0.04,其取值区间是0.04~0.06之间

picFile = fileDialog.FileName;Mat tempPic = new Mat(picFile, ImreadModes.Grayscale);
Mat srcPic = new Mat(picFile, ImreadModes.AnyColor);Mat outPic = new Mat(tempPic.Size(), tempPic.Type());//角点检测
Cv2.CornerHarris(tempPic, outPic, 2, 3, 0.04);//归一化
Cv2.Normalize(outPic, outPic, 0, 255, NormTypes.MinMax);//Mat 数据类型转换
outPic.ConvertTo(outPic, MatType.CV_8UC1);picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(outPic);
picBox_Display.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(srcPic);

在这里插入图片描述

绘制角点思路:遍历CornerHarris输出矩阵的像素值,设置阈值,大于阈值的像素位置即可以认为是角点

picFile = fileDialog.FileName;Mat tempPic = new Mat(picFile, ImreadModes.Grayscale);
Mat srcPic = new Mat(picFile, ImreadModes.AnyColor);
Mat displayPic = srcPic.Clone();Mat outPic = new Mat(tempPic.Size(), tempPic.Type());//角点检测
Cv2.CornerHarris(tempPic, outPic, 2, 3, 0.04);//归一化
Cv2.Normalize(outPic, outPic, 0, 255, NormTypes.MinMax);//Mat 数据类型转换
outPic.ConvertTo(outPic, MatType.CV_8UC1);int threshValue = 130;//角点阈值//遍历输出矩阵
for (int i= 0; i < outPic.Rows; i++){for(int j = 0; j < outPic.Cols; j++){var value = outPic.Get<byte>(i, j);if (value >= threshValue){//绘制圆Point point = new Point(j, i);                           Cv2.Circle(displayPic,point, 10,Scalar.Red, 2);}}}picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(displayPic);
picBox_Display.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(srcPic);

在这里插入图片描述
补充说明:
本案例在.NET使用的OpenCV库为OpenCvSharp4

.NET 环境的OpenCv库

http://www.xdnf.cn/news/844345.html

相关文章:

  • 金融专业英语词汇大全
  • java聊天室回调_用JavaEE7、Websockets和GlassFish4打造聊天室(一)
  • TOGAF架构开发方法
  • flowable使用流程任务和监听器设计知会我的任务
  • 调用ThunderAgent 迅雷局域网版的开发
  • 如何监控员工电脑的聊天记录
  • Java 11 新特性介绍
  • 2024年最全网络安全人士必备的13个漏洞库_通用漏洞数据库,你还看不懂吗
  • Java面试复习大纲
  • RFID开发介绍—概述
  • Microsoft Office SharePoint Designer 2007 简介
  • Git常用命令行整理(非常详细)零基础入门到精通,收藏这一篇就够了
  • QT下载安装
  • 用 Java 实现人脸识别功能
  • 全面解析性能测试中的瓶颈分析与优化策略!
  • NOIP 2008 普及组初赛试题完善程序 4.2 (找第k大的数)
  • d3dcompiler_43.dll丢失了怎么办,详细解答和d3dcompiler_43.dll修复方法
  • 常用的自动化测试工具有哪些?
  • 阿里巴巴中国站1688商品详情API:获取商品详情的指南和最佳实践
  • 微信小程序云开发使用方法新手初体验
  • U盘内数据防拷贝的方法:U盘里面的文件怎么不让复制
  • Go 语言开发工具
  • 木马彩衣的原理和代码示例
  • VBA:VBA常用小代码合集
  • Win32中调用其他应用程序的方法(函数)winexec,shellexecute ,createprocess
  • JS弹出确认、取消对话框
  • PT100温度采集
  • 《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)
  • HTTP知识
  • Android高级架构进阶之数据传输与序列化