openCV专栏

openCV专栏,第1张

OPENCV基础 *** 作

提示:本专栏所用版本仅供参考,其他版本也可

版本
pythonPython 3.9.3
opencv4.5.5
matplotlib3.4.3
numpy1.19.5
QQ学习群点击加群:928357277

学习目录
  • 提问环节
    • 1:什么是凸包
    • 2:凸包有什么特征
    • 3:如何获取凸包
  • 获取凸包
    • 获取并绘制凸包多边形
    • 凸缺陷
      • 缺陷点集展示
  • 几何学测试
    • 检测轮廓是否是凸形的
    • 点到轮廓的垂线(最短)距离及位置判定
    • 判断逼近多边形是否为凸包并判断点A和轮廓的关系

提问环节 1:什么是凸包

答:凸包是一种对逼近多边形简化的多边形,是物体最外层的“凸”多边形

2:凸包有什么特征

答:它的每一处都应该是凸起的,在凸包内,任意连续的三个点的内角小于180度

3:如何获取凸包

答:openCV提供了函数convexHull() 来获取

获取凸包

hull = cv2.convexHull(points[,clockwise[,returnPoints]])
返回值为凸包角点hull
参数为:轮廓points,顺逆时针标志clockwise,返回轮廓特性标志(返回x/y轴坐标,或凸包角点)

获取并绘制凸包多边形
import matplotlib.pyplot as plt #导入模块
import cv2
import numpy as np

img = cv2.imread('1.jpg')

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
r,imgGray = cv2.threshold(imgGray,180,255,cv2.THRESH_BINARY_INV)
c,h = cv2.findContours(imgGray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#构造矩形边框

print(c[2].shape)
# 得到凸包的角点
hull = cv2.convexHull(c[2])
#绘制凸包
cv2.polylines(imgGray,[hull],True,(255,255,255),2)
#显示图片
cv2.imshow('imgGray',imgGray)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:红色箭头为后期添加

凸缺陷

凸包与轮廓之间的部分,称为为凸缺陷
convexityDefects = cv2.convexityDefects(contour,convexhull)
返回值;convexityDefects为缺陷点集,是一个数组,每一行包含[起点,终点,轮廓上距离凸包最远的点,最远点到凸包的近似距离]
参数为:轮廓contour、凸包convexhull

缺陷点集展示
import cv2

img = cv2.imread('1.jpg')

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
r,imgGray = cv2.threshold(imgGray,180,255,cv2.THRESH_BINARY_INV)
c,h = cv2.findContours(imgGray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

# 得到凸包
hull = cv2.convexHull(c[10],returnPoints=False)
defects = cv2.convexityDefects(c[10],hull)
#构造缺陷包

for i in range(defects.shape[0]):
    s,e,f,d = defects[i,0]
    start = tuple(c[10][s][0])
    end = tuple(c[10][e][0])
    far = tuple(c[10][f][0])
    cv2.line(imgGray,start,end,[255,255,255],2)#绘制直线
    cv2.circle(imgGray,far,5,[0,0,0],-1)#绘制圆形

#显示图片
cv2.imshow('imgGray',imgGray)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

几何学测试 检测轮廓是否是凸形的

retval = cv2.isContourConvex(contour)
返回值为轮廓凸形转态
参数为轮廓

(全代码后面有演示)

retval = cv2.isContourConvex(hull)#判断是否是凸形
点到轮廓的垂线(最短)距离及位置判定

retval = cv2.pointPolygonTest(contour,pt,measureDist)
返回值为距离或者点对线的位置
参数为:轮廓Contour、待判定的点pt,距离判定方式measureDist(当为True时,表示计算距离,当为False时,表示得到位置)
全代码后面有演示)

retval = cv2.cv2.pointPolygonTest(hull,(300,150),True)#判断点(300,150)到轮廓的距离
判断逼近多边形是否为凸包并判断点A和轮廓的关系
import cv2

img = cv2.imread('1.jpg')

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
r,imgGray = cv2.threshold(imgGray,180,255,cv2.THRESH_BINARY_INV)
c,h = cv2.findContours(imgGray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

#绘制逼近多边形
imgGrayL = imgGray.copy()
epslion = 0.01*cv2.arcLength(c[10],True)
approx = cv2.approxPolyDP(c[10],epslion,True)
retL = cv2.isContourConvex(approx)
imgGrayL = cv2.cvtColor(imgGrayL,cv2.COLOR_GRAY2BGR)
imgGrayL = cv2.drawContours(imgGrayL,[approx],0,(255,255,0),2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(imgGrayL,'%s%d'%("it is : ",retL),(100,100),font,1,(255,0,255),2)#将结果写入屏幕中
# 判断点和轮廓的关系
hull = cv2.convexHull(c[10])
imgGray = cv2.cvtColor(imgGray,cv2.COLOR_GRAY2BGR)#转换为BGR色彩空间
cv2.polylines(imgGray,[hull],True,(0,255,0),2)
rev = cv2.pointPolygonTest(hull,(300,150),True)
cv2.putText(imgGray,'A',(300,150),font,1,(0,255,0),3)#将结果写入屏幕中

#显示图片
cv2.imshow('imgGray',imgGray)
cv2.imshow('imgGrayL',imgGrayL)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

如果你也喜欢编程,点击群号加入我们的QQ大家庭 928357277吧!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/800802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存