every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

二维面找角点/关键点 实现

1. 正文

1.1 前提

1.1.1 显示函数

def show(arr):plt.imshow(arr)plt.show()def cvshow(arr):cv2.namedWindow('a', 0)cv2.imshow('a', arr)cv2.waitKey(0)cv2.destroyAllWindows()

1.1.2 数据

数据准备

img1 = np.zeros((1080, 1920, 3), np.uint8)
img2 = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[0, 200], [1500, 200], [1500, 400], [0, 400]])

填充

m1 = cv2.fillPoly(img1, [area1], (255, 255, 255))
m2 = cv2.fillPoly(img2, [area2], (255, 255, 255))


交集

res = cv2.bitwise_and(m1, m2)

1.2 方法一: 先找轮廓再找凸包

前置:

凸包: 简单解释,给定二位平面上的点击,凸包就是将最外层的点链接起来构成凸多边形,它包含所有的点

最终要的一点,可以实现对点集排序!!!!

默认是顺时针,先左上。若点出现偏移可能会右下开始,只要求点有序即可,可以不做深入研究。

例子:

import cv2
hull = cv2.convexHull(points, clockwise, returnpoints)
  • hull : 输出凸包结果,n * 1 * 2 数据结构,n为外包围圈点数
  • points: 输入的坐标点,通常为1 * n * 2 结构,n为所有的坐标点的数目
  • clockwise:转动方向,TRUE为顺时针,否则为逆时针;
  • returnPoints:默认为TRUE,返回凸包上点的坐标,如果设置为FALSE,会返回与凸包点对应的轮廓上的点。
a. 找轮廓
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)  # 转灰度
_, bin = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)  # 阈值
# 找轮廓
contours, hierarchy = cv2.findContours(bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 轮廓画在图上
cv2.drawContours(res, contours, -1, (0, 0, 255), 5)
cvshow(res)

b. 找凸包
hull = cv2.convexHull(contours[0])
c. 显示凸包

这里我们遍历凸包点,将点画在原图上。这里是以点画圆,值得注意的是,点的颜色随着次序改变而改变,具体来说,(opencv中是BRG)红色逐渐减弱,绿色逐渐加深,渐变的大小为20,可以根据点数自己设定,如10等。

color_offset = 20
for idx, i in enumerate(hull):x, y = i.ravel()cv2.circle(res, (x, y), 1, (0, color_offset * idx, 255 - color_offset * idx), -1)
d. 显示

注意:需要将cv2.drawContours注释,否则会有遮挡

cvshow(res)

如下图所示,我们看到点是按顺序排列的!!!!


e. 方法一总代码
# 方法一:先找轮廓再找凸包
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)  # 转灰度
_, bin = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)  # 阈值
# 找轮廓
contours, hierarchy = cv2.findContours(bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 轮廓画在图上
cv2.drawContours(res, contours, -1, (0, 0, 255), 5)
hull = cv2.convexHull(contours[0])

1.3 方法二:先找角点再找凸包

a. 找角点
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)  # 转灰度
corners = cv2.goodFeaturesToTrack(gray, 0, 0.01, 10) # 寻找角点
b. 显示一下角点
color_offset = 20
for idx, i in enumerate(corners):x, y = i.ravel()cv2.circle(res, (x, y), 1, (0, color_offset * idx, 255 - color_offset * idx), 3)cvshow(res)

如下图所示,点是没有顺序的,这是 因为上面的角点检测算法返回的点的结果是点的质量返回的,即点检测质量越好约靠前。下图我们可以看到四个角上点质量最好排在前面,我们实际应用需要这些点有序。

c. 凸包
corners = np.int0(corners)
hull = cv2.convexHull(corners)
d. 显示凸包
color_offset = 20
for idx, i in enumerate(corners):x, y = i.ravel()cv2.circle(res, (x, y), 1, (0, color_offset * idx, 255 - color_offset * idx), 3)cvshow(res)

e. 方法二总代码
# 方法二:先找角点再找轮廓
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)  # 转灰度
corners = cv2.goodFeaturesToTrack(gray, 0, 0.01, 10) # 寻找角点
corners = np.int0(corners)
hull = cv2.convexHull(corners)

1.4 找轮廓点(角点、关键点)(附)

显示找到的点,点的颜色代表顺序。我们这里是点的顺序按从红色到绿色

color_offset = 20
for idx, i in enumerate(points):x, y = i.ravel()cv2.circle(res, (x, y), 1, (0, color_offset * idx, 255 - color_offset * idx), 3)cvshow(res)

后续的案例图,放在这里提前看下,可以不深究,后续会逐步讲解

参考

[1] https://www.cnblogs.com/01black-white/p/16070686.html

[2] https://blog.csdn.net/weixin_44690935/article/details/109008946

[3] https://blog.csdn.net/lovetaozibaby/article/details/103214672

【opencv】二维面找角点/关键点 实现相关推荐

  1. JavaCV/OpenCV 二维码扫描功能

    JavaCV/OpenCV 二维码扫描功能 怎样配置工程就不再赘述,不清楚的读者可以网上查找资料,二维码扫描功能通过JavaCV实现起来还是挺简单的,主要OpenCV中QRCodeDetector提供 ...

  2. opencv二值化找轮廓检测背景简单小物体

    一.前言 本篇主要是针对背景简单,且具有固定颜色的单类小物体,方法为在灰度化时选用图片的HSV中的S通道,再使用opencv 二值化找轮廓大法可将小物体框出. 原理很简单,图片->取S通道灰度化 ...

  3. opencv 二维图像 特征检测 特征描述 特征匹配 平面物体识别跟踪

    github代码 一.Harris角点 cornerHarris() R = det(M) - k*(trace(M))^2  算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与 ...

  4. opencv二维码识别解码

    目的: 使用opencv库识别QR二维码,框出图片中的二维码,并使用开源库Zxing解码,在这过程中学习理解opencv库相应的函数. 环境: 1. window7系统 2. QT create 1. ...

  5. opencv 二维码定位

    最近师兄跟我提到我二维码定位,参考了许多大佬的程序,写了这个小程序 目的: 用opencv的库实现QRcode定位 环境: Windows 10 VS2015 opencv3.4.0 基本原理 下图为 ...

  6. OpenCV 二维码定位与识别

    因为二维码本身含有信息,因此可以作为产品的信息载体,如:产品特征.在工业领域常用在产品入库.分拣和包装上.但常常会因为二维码图像污点.光照不均匀以及二维码图像倾斜等原因,使得二维码的识别正确率低,针对 ...

  7. Zbar+ROS+opencv二维码识别与定位研究(一)

    1.本文利用二维码的边缘信息,对其进行定位,经检验在3-4m以内有良好的定位效果 2.主要步骤: 原图像大小调整,提高运算效率:转化为灰度图:高斯平滑滤波: 求得水平和垂直方向灰度图像的梯度差,使用S ...

  8. c语言二维数组找鞍点,C语言,二维数组 找鞍点

    还是以前写过的东西.. 鞍点是什么?百度出来的东西 鞍点(Saddle point)在微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的奇点,叫做鞍点.在泛函中,既不是极大值点也不是极小值点的临界 ...

  9. 二维数组找鞍点C++

    题目描述 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,二维数组的行列n,m以及二维数组均由键盘输入,当存在鞍点时,输出位置以及该点的值,当不存在鞍点时,输出-1 例如输入: ...

最新文章

  1. 革命就是请客吃饭(案例分析吧)
  2. mac 部署python环境
  3. Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many
  4. 第一章 python学习,个人对计算机硬件的一些理解
  5. git fetch 和git pull 的差别
  6. Kettle常用的配置文件
  7. c语言中for语句的作用是,c语言中for语句是怎么用的
  8. 工作325:uni-日期小于10补0
  9. iOS OC与JS交互(WebView监听事件)
  10. 转贴: mysql-5.7.20 编码由 utf8 改为 utf8mb4
  11. 【Spring 核心】装配Bean(一) 自动化装配
  12. qt messagebox退出程序_Qt多线程创建
  13. 新品Demo —— ZStack Mini 超融合一体机
  14. 【下载一】NI 系列软件卸载工具
  15. layerdate一款很好用日期插件
  16. 简历编辑导出工具(类似wps简历助手)
  17. 解决win10新建文本文档内容可以打开但显示图标不对的问题
  18. Vue3 学习笔记 —— transition、transition-group
  19. 华硕主板装系统蓝屏_华硕主板电脑怎么重装系统,开机过后蓝屏怎么解决
  20. java坦克大战(1.0)

热门文章

  1. python矩阵变成图片_Python图片转换成矩阵,矩阵数据转换成图片
  2. /etc/xinetd.d 的使用
  3. 邻接矩超详解(C/C++)
  4. 【信号与系统】(六)连续系统的时域分析 ——冲激响应与阶跃响应
  5. getch()和getche()
  6. Linux Tomcat JSP 布署详细教程
  7. B站不能拖动视频进度条问题
  8. vm磁盘映射 不能启动_iOS 启动优化之Clang插桩实现二进制重排
  9. java构造方法:有参构造方法和无参构造方法区别
  10. intell idea 快速启动设置