代码

import cv2
import numpy as np"""
查找图像轮廓,计算图像矩,根据公式计算轮廓周长和面积
面积:cv2.contourArea()|M['m00']
周长:cv2.arcLength()有两类边界矩形,直边界矩形,旋转边界矩形。直边界矩形(就是没有旋转的矩形),使用函数cv2.boundingRect()可以查找到,因为直边界矩形不考虑矩形旋转,所以直边界矩形的面积不是最小。旋转矩形,这个矩形的面积最小,因为他考虑了矩形的旋转。使用函数cv2.minAreaRect可以得到,函数返回一个Box2D结构,其中包含旋转矩形左上角坐标(x, y),矩形的宽高(w, h),以及旋转角度。但是绘制一个矩形需要四个角点,可以通过函数cv2.boxPoints()获得。
approxPolyDP(curve, epsilon, closed[, approxCurve]) -> approxCurve
第二个参数epsilon:指定原始轮廓到近似轮廓的最大距离,函数返回拟合的多边形边数。"""def stackImages(scale, imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range(0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank] * rowshor_con = [imageBlank] * rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor = np.hstack(imgArray)ver = horreturn verdef getContours(img):# 查找轮廓,cv2.RETR_ExTERNAL=获取外部轮廓点, CHAIN_APPROX_NONE = 得到所有的像素点contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 循环轮廓,判断每一个形状for cnt in contours:# 获取轮廓面积area = cv2.contourArea(cnt)print(area)# 当面积大于500,代表有形状存在if area > 500:# 绘制所有的轮廓并显示出来cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)# 计算所有轮廓的周长,便于做多边形拟合peri = cv2.arcLength(cnt, True)# 多边形拟合,获取每个形状的 边approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)print(len(approx))objCor = len(approx)# 获取每个形状的x,y,w,hx, y, w, h = cv2.boundingRect(approx)# 计算出边界后,即边数代表形状,如三角形边数=3if objCor == 3:objectType = "Tri"elif objCor == 4:# 判断是矩形还是正方形aspRatio = w / float(h)if aspRatio > 0.98 and aspRatio < 1.03:objectType = "Square"else:objectType = "Rectangle"# 大于4个边的就是圆形elif objCor > 4:objectType = "Circles"else:objectType = "None"# 绘制文本时需要绘制在图形附件cv2.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(imgContour, objectType,(x + (w // 2) - 10, y + (h // 2) - 10), cv2.FONT_HERSHEY_COMPLEX, 0.7,(0, 0, 0), 2)path = 'Resources/shapes.png'
img = cv2.imread(path)
imgContour = img.copy()# 灰度化
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯平滑
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 1)
# 边缘检测
imgCanny = cv2.Canny(imgBlur, 50, 50)
# 获取轮廓特征点
getContours(imgCanny)imgBlank = np.zeros_like(img)
imgStack = stackImages(0.6, ([img, imgGray, imgBlur],[imgCanny, imgContour, imgBlank]))cv2.imshow("Stack", imgStack)cv2.waitKey(0)

效果图

原图链接:
百度网盘链接: https://pan.baidu.com/s/1rTqz1hr0BY2u7Qmjw66VDQ 提取码:j34c

python识别图形形状相关推荐

  1. Python模拟登录,Python识别图形验证码实现自动登陆

    前言 利用Python识别图形验证码,selenium模块实现自动登陆.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re: numpy模块: pytess ...

  2. python 识别图形验证码_Python验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...

  3. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...

    图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...

  4. python 识别图形验证码_python爬虫20 | 小帅b教你如何用python识别图片验证码

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

  5. Python识别图形验证码

    import ddddocr from selenium import webdriver from selenium.webdriver.common.by import By from del_p ...

  6. python代码标识码_代码分享:使用Python和Tesseract来识别图形验证码

    原标题:代码分享:使用Python和Tesseract来识别图形验证码 *本文原创作者:ipenox,本文属FreeBuf原创奖励计划,未经许可禁止转载 各位在企业中做Web漏洞扫描或者渗透测试的朋友 ...

  7. 用python绘制漂亮的图形-用python绘制图形的实例详解

    1.环境系统:windows10 python版本:python3.6.1 使用的库:matplotlib,numpy 2.numpy库产生随机数几种方法import numpy as npnumpy ...

  8. 练习2: Python基本图形绘制 (第2周)

    练习2: Python基本图形绘制 (第2周) 文章目录 练习2: Python基本图形绘制 (第2周) turtle库语法总结 Python蟒蛇绘制 turtle正方形绘制 turtle六边形绘制 ...

  9. python桌面图形_Python桌面图形程序美化的方法论

    很多人都吐槽,使用 Tkinter.PyQt5等工具制作出来的图形界面程序太丑了.既然觉得它丑,我们来想想,它为什么会那么丑. 功能性是开发的第一要务 每一个 Python 图形界面库都有它自有的功能 ...

  10. Python桌面图形程序美化的方法论

    很多人都吐槽,使用 Tkinter.PyQt5等工具制作出来的图形界面程序太丑了.既然觉得它丑,我们来想想,它为什么会那么丑. 功能性是开发的第一要务 每一个 Python 图形界面库都有它自有的功能 ...

最新文章

  1. C++实践参考——时间类
  2. codeforces315Div1 B Symmetric and Transitive
  3. 征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例
  4. Android listview item中使用TextWatcher
  5. maven servlet配置_Servlet入门
  6. 海外php程序员,国外PHP程序员的13个好习惯_php
  7. serviceFabric oracle,Oracle ASM和多路径软件的兼容性【转】
  8. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)
  9. docker容器部署的应用启动日志在哪里看_在SAP云平台上部署和运行Docker应用
  10. tcl电视显示服务器异常1500,TCL电视机使用常见故障及维修方法
  11. java applet类开始博饼_博饼小游戏java源代码.doc
  12. c# 文件服务器压缩图片,C#高质量无损压缩图片代码同享
  13. linux 双显卡如何切换显卡,解决Ubuntu双显卡切换问题
  14. Unity方便查看日志的插件Reporter
  15. 苹果高管公然“开怼”:三星抄袭 iPhone,只加了个大屏
  16. Cell Reports:任栓成/高东/胡志安/唐玲团队合作揭示压力性失眠发生的神经机制
  17. 获取当前时间戳-(Objective-C)
  18. pic12f508 c 语言教程,pic12f508中文资料
  19. Qt——用在ARM板上的Mplayer(1.3.0,1.0rc4)安装编译步骤!还有,Mplayer背景抖动闪烁问题解答,终于来了!
  20. 如何用mshtml获得Javascript中function的返回值[mshtml]

热门文章

  1. 使用 cajViewer 将 caj文件 转换 pdf文件
  2. Veu进阶--transition动画和animation动画的使用详解
  3. python 判断闰年
  4. CSV文件使用Excel打开
  5. c语言中求圆台体积公式,圆台体积公式是什么
  6. vue 实现数字滚动卡片
  7. VMware破解密码
  8. 如何修改ppt已有的版式
  9. mysql8 启动报错:Error while setting value ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DI
  10. 十三经结业:《诗经》之《蒹葭》赏析