opencv python 识别图形轮廓
目的:
1. 识别并框选出图片中红色的几何图形,分辨出各是什么图形(不允许用鼠标 操作)。
2. 将红色图形中心连线,计算连线围成图形的面积。
代码如下:
import cv2
import sys
import cmath
import numpy
#读取图像
areas = list()
x= list()
y = list()
img1 = cv2.imread("E:/a/qw.jpg")
(B,G,R) = cv2.split(img1)
retal , img2 = cv2.threshold(R,0,255,cv2.THRESH_OTSU)
contours, hierarachy = cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):#cv2.drawContours(img1,contours,i,(0,0,255),10)area = cv2.contourArea(contours[i],False)areas.append(area)
areas.sort(reverse=True)
for i in range(len(contours)):area = cv2.contourArea(contours[i],False)if area > areas[5]:if area < areas[1]:print(i)epsilon = 0.02 * cv2.arcLength(contours[i], True)approx = cv2.approxPolyDP(contours[i],epsilon,True)cv2.polylines(img1,[approx],True,(0,0,255),10)M = cv2.moments(contours[i])cx = int(M["m10"]/M["m00"])cy = int(M["m01"]/M["m00"])x.append(cx)y.append(cy)if len(approx) > 4:print("圆形")text = "y"elif len(approx) == 3:print("三角形")text = "s"elif len(approx) == 4:print("矩形")text = "j"cv2.putText(img1,text,(cx,cy),cv2.FONT_HERSHEY_PLAIN,10,(0, 255, 0),5)
S = (1/2)*(x[0]*y[1]-x[0]*y[2]+x[1]*y[2]-x[1]*y[0]+x[2]*y[0]-x[1]*y[1])
print("s=%d"%S)
pts = numpy.array([[x[0],y[0]],[x[1],y[1]],[x[2],y[2]]])
pts = pts.reshape((-1,1,2))
cv2.polylines(img1,[pts],True,(255, 0, 0),10)
cv2.namedWindow("RED",cv2.WINDOW_NORMAL)
cv2.imshow("RED",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
首先:
读取文件中的图片,注意:文件地址的斜杠要是/或\\,否则会报错
img1 = cv2.imread("E:/a/qw.jpg")
我们用imshow函数来显示图片的时候会发现图片过大屏幕显示不完
cv2.imshow("RED",img1)
比如这样,所以我们需要将图像变形以便更合适显示在我们的屏幕,利用下面的函数就可以舒服的显示我们的图像啦
cv2.namedWindow("RED",cv2.WINDOW_NORMAL)
标志参数 | 作用 |
WINDOW_AUTOSIZE | 根据图像大小显示窗口,不允许用户调整大小 |
WINDOW_FREERATIO | 窗口大小自适应比例 |
WINDOW_KEEPRATIO | 保持图像的比例 |
WINDOW_NORMAL | 显示图像后,允许用户随意调整窗口大小 |
进行图片的通道分离:利用split函数来分离出蓝、绿、红三种颜色的灰度图
(B,G,R) = cv2.split(img1)
这个是红色分离后的图像,可以看出红色的地方已经变成白色或灰色
然后经过图像二值化函数threshold()得到黑白的图像(二值图),从而把红色更好的提出
retal , img2 = cv2.threshold(R,0,255,cv2.THRESH_OTSU)
寻找图形轮廓,把刚刚得到的二值图放进函数,在二值图中寻找轮廓,返回每个轮廓的点contours
contours, hierarachy = cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
通过这个轮廓得到的点去画出得到的轮廓利用drawContours来画出:
cv2.drawContours(img1,contours,i,(0,0,255),10)
我们发现有很多的噪声需要消掉,我们通过判断面积来将不是红色轮廓的其他轮廓消除,不难看出红色的三个图形轮廓的面积在全部轮廓中排名3,4,5.所以我们通过contourArea()函数求出每个轮廓的面积并把他们放在areas列表中。
area = cv2.contourArea(contours[i],False)areas.append(area)
这是把其他轮廓去除之后的图形
我们发现这三分个轮廓,每个轮廓都是由很多个轮廓点组成,但是确实像矩形可以只用四个轮廓点表示,三角形可以只用三个轮廓点表示就可以了,所以下一步为了方便我们检测图形是否是三角形、圆形还是矩形,我们需要对轮廓点进行优化,所以我们就用到了approxPolyDP函数
epsilon = 0.02 * cv2.arcLength(contours[i], True)approx = cv2.approxPolyDP(contours[i],epsilon,True)
在这里epsilon作为一个参数,这个需要调一下。0.02就是调出来的。具体参考:
opencv 使用approxPolyDP轮廓近似_brooknew的专栏-CSDN博客
再利用polylines()函数来画出轮廓点之间的连线
cv2.polylines(img1,[approx],True,(0,0,255),10)
效果如下:
然后根据轮廓点的个数就可以判断是什么形状啦。
下一步我们寻找红色图形的中心点,用moments()函数求出图形的矩,并求出每个图形的重心,详细可以看
Python OpenCV findContours()函数与drawContours()函数用法_dz4543的博客-CSDN博客_drawcontours()参数说明
M = cv2.moments(contours[i])cx = int(M["m10"]/M["m00"])cy = int(M["m01"]/M["m00"])
然后根据三点求面积公式就可以求出三个重心围成的面积
S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1)
S = (1/2)*(x[0]*y[1]-x[0]*y[2]+x[1]*y[2]-x[1]*y[0]+x[2]*y[0]-x[1]*y[1])
然后利用polylines()函数连接三个重心
pts = numpy.array([[x[0],y[0]],[x[1],y[1]],[x[2],y[2]]])
pts = pts.reshape((-1,1,2))
cv2.polylines(img1,[pts],True,(255, 0, 0),10)
在这里reshape()是为了规范参数形式,让pts自适应维度大小。
最终的图形为
本文章是作者为了记录学习过程而写,如果有错误请大家指正。
opencv python 识别图形轮廓相关推荐
- Python模拟登录,Python识别图形验证码实现自动登陆
前言 利用Python识别图形验证码,selenium模块实现自动登陆.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re: numpy模块: pytess ...
- opencv python 识别视频水印_opencv+python实现视频实时质心读取
利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...
- OpenCV+Python识别车牌和字符分割
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
- 使用opencv+python识别七段数码显示器的数字识别
# 导入必要的包 from imutils.perspective import four_point_transform from imutils import contours import im ...
- python 识别图形验证码_Python验证码识别
大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...
- python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...
图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...
- python 识别图形验证码_python爬虫20 | 小帅b教你如何用python识别图片验证码
当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...
- 数字图像处理 使用opencv+python识别七段数码显示器的数字
一.什么是七段数码显示器 七段LCD数码显示器有很多叫法:段码液晶屏.段式液晶屏.黑白笔段屏.段码LCD液晶屏.段式显示器.TN液晶屏.段码液晶显示器.段码屏幕.笔段式液晶屏.段码液晶显示屏.段式LC ...
- opencv+python识别猪
背景:在车载监控回传的视频里判断该车里是否有猪 解决思路:在回传视频里做物体识别,如果有猪就框出来并且给出一个代表值 day1 2021-10-27 设想:物体识别,并且在图中框出来猪 1.找正样本 ...
- Python识别图形验证码
import ddddocr from selenium import webdriver from selenium.webdriver.common.by import By from del_p ...
最新文章
- OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用
- [转载]Token原理以及应用
- ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...
- Mongodb自带工具
- mysql服务等待应答超时_从mysql备份报错来看net_read_timeout 和net_write_timeout参数
- dell 如何给raid分区_用U盘启动盘给Dell服务器装系统找不到RAID阵列解决办法
- 将相同值的行内容进行合并操作--Sql2005
- appscan如何进行web端安全性测试_如何进行WEB安全性测试?
- 简单的HTML5 Web Storage留言册
- 【hdu1018】Big Number(求n!的位数----斯大林公式/log函数)
- 影视App下载页源码
- protel元件封装总结
- oracle中asm是什么,什么是ASM?
- 从空间、时间和时空动力学角度研究大脑的动态特性
- 性能魔方七剑下天山之青干剑:CDN2.0,速度加快一倍,成本减少一半
- 某人将1000元存入银行 某公司需用一台设备 某企业为了建一项目 建设期3年,共贷款700万元
- 【转载】那个裸辞的程序员,后来怎么样了?
- dedecms联动筛选_织梦dedecms联动筛选[伪静态版]
- Android Studio使用技巧系列教程(二)
- 【12c】扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE