百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

浅谈OpenCV之角点检测的点点滴滴(opencv零件角度识别)

toyiye 2024-07-05 01:26 14 浏览 0 评论

开始写的时候,并不知道怎么开头,内容还是太多,就列了几个问题来自问自答一下,然后想着写一下及代码实现效果好了。

什么是角点和斑点?

常用的检测算法有哪些?

角点检测算法在Pycharm上的实现及在Opencv4.1.0的API详解

实现代码及效果


什么是角点和斑点?

1.角点就是极值点,即在某方面属性特别突出的。角点是图像中一边物体的拐角或者线条之间的交叉部分,因此,图像(在两个方向)的梯度变化很大,可以用来检测。

2.斑点通常是指与周围有着颜色和灰度差别的区域。斑点是一个区域,斑点检测的主要思路都是检测出图像中比它周围像素灰度值大或比周围灰度值小的区域,所以它比角点的噪能力要强,稳定性要好。

常用的检测算法有哪些?

OpenCV中常用的特征检测和提取算法有如下六种:

(1)Harris:用于检测角点;

(2)SIFT:用于检测斑点;

(3)SURF:用于检测斑点;

(4)FAST:用于检测角点;

(5)BRIEF:用于检测斑点;

(6)ORB:表示带方向的FAST算法与具有旋转不变性的BRIEF算法;

这个是参考http://www.yyearth.com/index.php?aid=233

角点检测算法在Pycharm上的实现及在Opencv4.1.0的API详解

目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。

开发环境:Windows上Pycharm

1.Harris:用于检测角点

Python:	
	dst	=	cv.cornerHarris(	src, blockSize, ksize, k[, dst[, borderType]]	)
Parameters
src	Input single-channel 8-bit or floating-point image.(输入8位图或者浮点图)
dst	Image to store the Harris detector responses. It has the type CV_32FC1 and the same size as src .(存储Harris检测结果的输出图像)
blockSize	Neighborhood size. (领域大小)
ksize	Aperture parameter for the Sobel operator.(Sobel求导中使用的窗口大小)
k	Harris detector free parameter. See the formula above.(Harris 角点检测方程中的自由参数,取值参数为 [0.04,0.06].)
borderType	Pixel extrapolation method. See BorderTypes.(边界的类型)

实例1:

import cv2

import numpy as np

import glob

images = glob.glob(r'C:/Users/admin/Desktop/python_test/?.jfif')

for fname in images:

img = cv2.imread(fname)

#转为灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#数据类型变成float32

gray = np.float32(gray)

dst = cv2.cornerHarris(gray, 2, 3, 0.04)

 #膨胀 提升后续图像角点标注的清晰准确度
 dst = cv2.dilate(dst, None)
 #这么多返回是满足条件的dst索引值  根据索引值来设置这个点的颜色
 #参考https://cloud.tencent.com/developer/article/1149963
 img[dst > 0.01 * dst.max()] = [0, 0, 255]
 #显示图片
 cv2.imshow('dst', img)

#表示图片停留的时间, 0表示按任意键退出

if cv2.waitKey(0) & 0xff == 27:

cv2.destroyAllWindows()

?程序运行输出

2.Shi-Tomasi 角点检测 goodFeaturesToTrack()

函数原型可以看OpenCV手册https://docs.opencv.org/4.1.0/dd/d1a/group__imgproc__feature.html#ga1d6bb77486c8f92d79c8793ad995d541

Python:
	corners	=	cv.goodFeaturesToTrack(	image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]]	)
	corners	=	cv.goodFeaturesToTrack(	image, maxCorners, qualityLevel, minDistance, mask, blockSize, gradientSize[, corners[, useHarrisDetector[, k]]]	)

参数详解:

第一个参数image:8位或32位单通道灰度图像;

第二个参数corners:位置点向量,保存的是检测到的角点的坐标;

第三个参数maxCorners:定义可以检测到的角点的数量的最大值;

第四个参数qualityLevel:检测到的角点的质量等级,角点特征值小于qualityLevel*最大特征值的点将被舍弃;

第五个参数minDistance:两个角点间最小间距,以像素为单位;

第六个参数mask:指定检测区域,若检测整幅图像,mask置为空Mat();

第七个参数blockSize:计算协方差矩阵时窗口大小;

第八个参数useHarrisDetector:是否使用Harris角点检测,为false,则使用Shi-Tomasi算子;

第九个参数k:留给Harris角点检测算子用的中间参数,一般取经验值0.04~0.06。第八个参数为false时,该参数不起作用;

注1:

numpy中的ravel()、flatten()、squeeze()都有将多维数组转换为一维数组的功能,区别:

ravel():如果没有必要,不会产生源数据的副本

flatten():返回源数据的副本

squeeze():只能对维数为1的维度降维

注2:

cv2.line()//画线,

cv2.circle()//画圆,

cv2.rectangle()//长方形,

cv2.ellipse()//椭圆,

cv2.putText()//文字绘制

实例2:
import cv2
import numpy as np
import glob
images = glob.glob(r'C:/Users/admin/Desktop/python_test/1.jpg')
for fname in images:
 img = cv2.imread(fname)
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 gray = np.float32(gray)
 corners = cv2.goodFeaturesToTrack(gray, 500, 0.01, 10, None, None, 3, False, 0.04)
 #corners = cv2.goodFeaturesToTrack(gray, 500, 0.01, 10)
 corners = np.int0(corners)
 print(len(corners))
 for i in corners:
 x, y = i.ravel()
 cv2.circle(img, (x, y), 3, 255, -1)
 cv2.namedWindow('img' ,cv2.WINDOW_AUTOSIZE)
 cv2.imshow('img' ,img)
 cv2.waitKey(0)

程序运行输出:

136

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码