31-角点检测(EmguCV学习)

EmguCV实现旋转模板匹配的工业应用与优化 模板匹配是计算机视觉中的基础技术,通过比较目标图像与预定义模板的相似性实现物体检测与定位。其核心原理包括特征提取、相似度计算和位置优化三个关键步骤。在工业自动化领域,传统模板匹配技术面临旋转变化适应性差的痛点,而结合EmguCV的旋转模板匹配方案能有效解决这一问题。该技术采用多角度金字塔搜索算法,通过动态调整角度步长和ROI区域限制,实现±180度范围内的亚像素级定位,角度误差可控制在0.1度以内。典型应用场景包括PCB元件定位、瓶盖缺陷检测等工业视觉检测任务,其中EmguCV的.NET内存管理优势和C# 阅读详情

文章目录

说明

1、EmguCV中Harris角点检测函数:CvInvoke.CornerHarris();
参数harrisResponse为CV_32FC1的图像,计算后需要进行归一化或者阈值化,转换为CV8U再显示;
参数blockSize : 领域大小,和协方差矩阵M的计算有关(影响M的值)
在这里插入图片描述

在这里插入图片描述

2、Harris检测的结果衡量(角点响应度量):M为协方差矩阵,度量R判断是否为角点,需要自己选择判断合适的阈值;
在这里插入图片描述
在这里插入图片描述

3、Shi-Tomasi角点检测:EmguCV没有封装goodFeatureToTrack()方法,只能使用GFTTDetector类的Detect()方法来检测特征点;可以自己控制想要的角点数,使用更方便;
参数minDistance控制角点之间的距离;
在这里插入图片描述
在这里插入图片描述

4、亚像素级角点检测:cornerSubPix();
在这里插入图片描述

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;
using Emgu.CV.Features2D;

namespace lesson31
{
    class Program
    {
        static void Main(string[] args)
        {
            ///Harris角点检测
            //Mat src = CvInvoke.Imread("3.jpg");
            //CvInvoke.Imshow("input", src);
            //Mat gray = new Mat();
            //CvInvoke.CvtColor(src, gray, ColorConversion.Bgr2Gray);
            //Mat dst = new Mat();
            //CvInvoke.CornerHarris(gray, dst, 2, 3, 0.04);//角点检测
            //CvInvoke.Threshold(dst, dst, 0.005, 255, ThresholdType.Binary);
            //Console.WriteLine("Depth: {0}\nChannels: {1}", dst.Depth, dst.NumberOfChannels);
            //dst.ConvertTo(dst, DepthType.Cv8U);
            //CvInvoke.Imshow("CornerHarris", dst);
            //Image<Gray, Byte> img = dst.ToImage<Gray, Byte>();
            //for (int i = 0; i < img.Rows; i++)
            //{
            //    for (int j = 0; j < img.Cols; j++)
            //    {
            //        if (img.Data[i, j, 0] == 255)
            //        {
            //            CvInvoke.Circle(src, new Point(j, i), 2, new MCvScalar(0, 255, 0), -1);
            //        }
            //    }
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///另一种方法
            //Mat src = CvInvoke.Imread("3.jpg");
            //Mat grayImg = new Mat();
            //CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);

            //Mat dst = new Mat();
            //CvInvoke.CornerHarris(grayImg, dst, 2, 3, 0.04, BorderType.Default);
            //Mat scaleImg = new Mat();
            //CvInvoke.Normalize(dst, dst, 0, 255, NormType.MinMax, DepthType.Cv32F);
            //CvInvoke.ConvertScaleAbs(dst, scaleImg, 1, 0);
            //Image<Gray, Byte> img = scaleImg.ToImage<Gray, Byte>();
            //for(int i = 0; i < img.Rows;i++)
            //{
            //    for(int j =0; j < img.Cols; j++)
            //    {
            //        if(img.Data[i,j,0] > 100)           //阈值选取很重要,控制角点个数
            //        {
            //            CvInvoke.Circle(src, new Point(j, i), 3, new MCvScalar(0, 255, 0), -1);
            //        }
            //    }
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///Shi-Tomasi角点检测
            //Mat src = CvInvoke.Imread("mask2.jpg");
            //Mat grayImg = new Mat();
            //CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);
            //GFTTDetector gFTT = new GFTTDetector(12, 0.01, 1, 3, false, 0.04);
            //MKeyPoint[] points = gFTT.Detect(grayImg);      //使用Shi-Tomasi检测算法检测特征点
            //for(int i = 0; i < points.Length; i++)
            //{
            //    Point pt = new Point();
            //    pt.X = (int)points[i].Point.X;
            //    pt.Y = (int)points[i].Point.Y;

            //    CvInvoke.Circle(src, pt, 3, new MCvScalar(0, 0, 255), -1);
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///亚像素角点检测
            Mat src = CvInvoke.Imread("3.jpg");
            CvInvoke.Imshow("input", src);

            Mat grayImg = new Mat();
            CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);
            Mat harrisImg = new Mat();
            CvInvoke.CornerHarris(grayImg, harrisImg, 2, 3, 0.04);
            CvInvoke.Threshold(harrisImg, harrisImg, 0.01, 255, ThresholdType.Binary);
            Mat dst = new Mat();
            harrisImg.ConvertTo(dst, DepthType.Cv8U);
            CvInvoke.Imshow("mask", dst);


            VectorOfPointF corners = new VectorOfPointF();
            Image<Gray, Byte> img = dst.ToImage<Gray, Byte>();
            for(int i = 0; i < img.Rows; i++)
            {
                for(int j = 0; j < img.Cols; j++)
                {
                    if(img.Data[i,j,0] == 255)
                    {
                        CvInvoke.Circle(src, new Point(j, i), 3, new MCvScalar(0, 0, 255), -1);
                        PointF[] pt = new PointF[1];
                        pt[0].X = j;
                        pt[0].Y = i;
                        corners.Push(pt);
                    }
                }
            }
            CvInvoke.Imshow("result", src);
            MCvTermCriteria termCriteria = new MCvTermCriteria(40, 0.001);
            CvInvoke.CornerSubPix(grayImg, corners, new Size(5, 5), new Size(-1, -1), termCriteria); //亚像素级角点精确化
            for(int i = 0; i < corners.Size; i++)
            {
                Console.WriteLine("corner {0} : ({1:F2},{1:F2})", i, corners[i].X, corners[i].Y);
            }

            CvInvoke.WaitKey(0);
        }
    }
}

效果

1、Harris角点检测:
在这里插入图片描述
使用不同阈值,检测到的角点数也不同:
在这里插入图片描述
2、Shi-Tomasi检测:(GFTTDetector)
在这里插入图片描述

3、亚像素级角点精确化:
在这里插入图片描述

Opencvsharp --- 检测矩形&计算偏移量 OpenCvSharp是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV 8 U C 3 每通道的字节数 每通道的数据类型 固定为C,指Channel 通道数 例如,一般的无透明彩色图,每一格像素包含了RGB三个通道,所以其类型为8UC3,如果还包含透明度信息,则选用8UC4类型。 ... 阅读详情

相关推荐

emgucv4学习18---角点检测

目前的角点检测算法可归纳为 3 类:基于灰度图像的角点检测、基于二 值图像的角点检测、基于轮廓曲线的角点检测。角点是图像很重要的特征, 对图像图形的理解和分析有很重要的作用。其中基于灰度图像的角点检测又 可分为基于梯度、基于模板和基于模板梯度组合 3 类方法,其中基于模板的 方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对 比足够大的点定义为角点。常见的基于模板的角点检测算法有 Kitchen-Rosenfeld 角点检测算法,Harris 角点检测算法、KLT 角点检测算...

qianxun 652

Emgucv使用Harris角点检测和Fast角点检测

角点是两个边缘的连接点,代表了两个边缘变化的方向上的点,在这点上图像梯度有很高的变化。是图像中的重要特征点。在opencv中还有改进版的Harris角点检测:Shi-Tomasi 角点检测算法,但在Emgucv里并没有封装,所以目前无法直接使用。 一、Harris角点检测 Harris角点检测通过判断点在水平和竖直方向上的变化程度来判断是否为角点,使用CornerHarris函数,处理后再用阈值

k 7853

C#图像处理 | EmguCV+OpenCVSharp二合一教程 你值得拥有

VS2017+EmguCV3.4高清入门视频教程 视频教程原链接如上,内容预览与目录如下 EmguCV+OpenCVSharp视频教程二合一版本 C#视觉开发者必备 EmguCV基础视频教程---第01讲(EmguCV介绍与安装配置) EmguCV基础视频教程---第01讲---补充更新(EmguCV3.4.1安装配置) EmguCV基础视频教程---第02讲(EmguCV自带例程赏析) EmguCV基础视频教程---第03讲(图像读取_显示_保...

Color Space的博客 4417

关于EMGU CV的那些事——3.不同角点检测算法比较

最近几个月一直忙着研究,现在将这几个月的学习过程一一分享出来~ 博主之前用C#和EmguCV测试了不同的角点检测算法并比较了他们的性能和用时。Harris不具备尺度不变性,Fast是harris的简化版,速度快但是没有旋转不变性和尺度不变性。Sift依旧好用但是速度慢,Surf简化了Sift的一些步骤提高了速度但依旧不能达到实时效果(30FPS)。Orb使用改进的fast检测子和brief描述子

Change The World 6999

C#轮廓检测 vs C++ OpenCV:性能、生态、部署全维度核爆对决!第4点让.NET开发者连夜重写架构

【工业级轮廓检测性能生死战】摘要: 当C# EmguCV(238ms/帧)遭遇C++ OpenCV(17ms/帧)时,工业质检系统崩溃边缘暴露致命差距。核心发现: 性能鸿沟:200ms延迟在实时视觉中意味着200万召回损失或安全事故 技术解剖:C++通过零内存拷贝+SIMD指令实现14倍性能碾压 内存战争:C#的3次托管/非托管转换成性能杀手 工业启示:轮廓检测不是API调用比赛,而是预处理、算法选择和内存管理的系统工程 (字数:149字) 注:摘要提炼了原文核心冲突、技术差异和工业影响,删除代码细节保留关

墨夶的博客 1137

EmguCV实现不同角点检测

使用C#和EmguCV实现了不同算法的角点检测,包括Harris,Fast,Sift,Surf,Orb算法。我将他们写在了一个界面里,用户选择图像即可。

EmguCV学习——简单算法 差分与高斯

公司项目需要检测运动物体,我对opencv也没啥研究,google了好久看了好多方法,最简单的就是差分与高斯背景建模了。 旁边搞c++的同事正在搞更nb的算法,等出来了 我再转成C#版的分享。 先看差分 1 //移动窗口       [System.Runtime.InteropServices.DllImportAttribute("ope...

weixin_30569153的博客 231

EmguCV实现实时角点检测

从摄像头读取数据,利用不同方法检测角点并画在图像上,结束时显示fps。

基于Emgu CV 的手势识别实现PPT的控制放映

Emgu CV 简介 众所周知,Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV。开发者可以很方便的通过C#,VB等语言调用OpenCV函数来实现相应的图像处理功能。 其下载地址为:http://www.emgu.com/wiki/index.php/Main_Page。安装过程极其简单,网上教程很多,这里也就不详述了...

weixin_30699955的博客 516

C#-EmguCV 特征匹配

C#版本EmguCV,实现特征匹配,对特征点进行处理,标识

emgucv3.0检测角度,相机校正,图片保存

emgucv3.0检测角度,相机校正,图片保存,本人亲测有效,希望对你有帮助。

[转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测

Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较。 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。Canny边缘检测算子是John F. Canny于1986年开发出来的一个多级边缘检测算法。 ...

weixin_30897079的博客 301

halcon与c#联合编程实现相机控制+图像平移缩放+日志记录+缺陷检测+路径规划

halcon与c#联合编程实现相机控制+图像平移缩放+日志记录+缺陷检测+路径规划 前言 本人近期在工作中遇到需要对某场景下利用海康相机进行图像缺陷检测与对应路径规划。通过对海康相机示例代码进行吸收与借鉴,最终实现了对海康相机的控制,并增加HSmartWindowControl控件,实现图像的实时显示与平移缩放功能;通过listview+toolstrip实现日志显示与类型(提示、警告、错误)分类;同时自行编制算法实现对缺陷的识别以及缺陷外扩矩形范围内的路径规划。 1.日志记录 代码如下(示例):

weixin_37864926的博客 2717

编写高效的C#图像处理程序(3) Rgb=>Lab,图像缺陷检测的例子

作者:xiaotie 转自:http://www.cnblogs.com/xiaotie/archive/2011/01/13/1934170.html 最近项目需要检测图像是否存在偏色、过亮、模糊等缺陷。由于主要用在视频监控上,对性能要求比较高。有几项检测必须要在Lab彩色下进行,而众所周知Rgb => Lab 计算量较大,C#搞得定搞不定?测试表明,用纯C#编写的Rgb =

老瓦的笔记本 1997

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 423

K-近邻算法: k-nearest neighbor classification (kNN) 详细介绍

@创建于:2020.04.09 @修改于:2020.04.09,2024.06.22 文章目录1、kNN介绍2、k近邻法的三要素详解2.1 距离度量2.2 k值的选择2.3 分类决策规则3、k近邻法的实现:kd树4、Python实现过程5、优缺点6、常见问题 1、kNN介绍 kNN是一个基本而简单的分类算法,作为监督学习,那么KNN模型需要的是有标签的训练数据,对于新样本的类别由与新样本距离最近的k个训练样本点按照分类...

chenhepg的博客 9万+

【黄豆计数】机器视觉黄豆数量计数【含GUI Matlab源码 8810期】

机器视觉黄豆数量计数 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 997

ZYNQ-7035+HMCAD1511高速数据采集系统设计

高速数据采集是电子测量、雷达信号处理与通信基带验证的核心技术基础,其性能瓶颈常集中于采样率、通道同步性与实时处理能力。基于ADC采样原理与SoC异构架构,高带宽、低抖动时钟链路与FPGA+ARM协同处理成为突破关键。ZYNQ-7035凭借275K逻辑单元与千级DSP资源,显著提升LVDS数据流吞吐与片上滤波/触发等实时算法部署能力;HMCAD1511则以1GSPS四通道同步采样和8位分辨率,满足示波器级动态范围需求。该组合广泛应用于嵌入式信号采集平台开发、教学实验系统构建及国产化仪器原型验证。

weixin_28939623的博客 261

orb特征提取

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; u

911的专栏 3539

ObjectMapper解析JSON数据

的时候捕获的数据,往往需要结合文档所定义的类进行转换,也就是。库中的一个关键类,它的作用是将。对象之间进行相互转换。

weixin_57128596的博客 975

微信商家转账报错“当前使用用户过多,请稍后重新确认收款”解决方案

当前使用用户过多,请稍后重新确认收款”这个错误,其实就是典型的参数误处理导致的假报错。记住一句话就行👇JSAPI 场景下的package参数不要做 UrlEncode。如果你也遇到这个问题,希望这篇文章能帮你少踩一个坑。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 784

C# OpenCvSharp DNN Onnx Demo 资源汇总

C# OpenCvSharp DNN Onnx Demo 资源汇总

.NET 人工智能实践 4900

【毕业设计之python系列】基于Flask的在线音乐网设计与实现

本论文旨在通过使用Python的Web框架Flask,设计和实现一个具有完整功能的在线音乐网站。该网站包括用户注册、登录、注销、歌曲上传、编辑、删除、歌单创建、编辑、删除、评论、搜索、音乐播放等功能,并针对不同用户角色(如普通用户、管理员)实现了不同的权限管理。同时,本论文还介绍了如何使用第三方API(如网易云音乐API)获取歌曲信息等技术实现。在设计上,本论文采用了MVC(Model-View-Controller)架构模式,将后端数据处理与前端展示分离,以便于代码的管理和维护。在数据库设计方面,本论文设

m0_56073435的博客 3243
上一篇: Harris角点检测原理详解(转载)
下一篇: C# .NET中的几种定时器(转载)
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值