目的:

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 识别图形轮廓相关推荐

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

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

  2. opencv python 识别视频水印_opencv+python实现视频实时质心读取

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

  3. OpenCV+Python识别车牌和字符分割

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  4. 使用opencv+python识别七段数码显示器的数字识别

    # 导入必要的包 from imutils.perspective import four_point_transform from imutils import contours import im ...

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

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

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

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

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

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

  8. 数字图像处理 使用opencv+python识别七段数码显示器的数字

    一.什么是七段数码显示器 七段LCD数码显示器有很多叫法:段码液晶屏.段式液晶屏.黑白笔段屏.段码LCD液晶屏.段式显示器.TN液晶屏.段码液晶显示器.段码屏幕.笔段式液晶屏.段码液晶显示屏.段式LC ...

  9. opencv+python识别猪

    背景:在车载监控回传的视频里判断该车里是否有猪 解决思路:在回传视频里做物体识别,如果有猪就框出来并且给出一个代表值 day1 2021-10-27 设想:物体识别,并且在图中框出来猪 1.找正样本 ...

  10. Python识别图形验证码

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

最新文章

  1. OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用
  2. [转载]Token原理以及应用
  3. ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...
  4. Mongodb自带工具
  5. mysql服务等待应答超时_从mysql备份报错来看net_read_timeout 和net_write_timeout参数
  6. dell 如何给raid分区_用U盘启动盘给Dell服务器装系统找不到RAID阵列解决办法
  7. 将相同值的行内容进行合并操作--Sql2005
  8. appscan如何进行web端安全性测试_如何进行WEB安全性测试?
  9. 简单的HTML5 Web Storage留言册
  10. 【hdu1018】Big Number(求n!的位数----斯大林公式/log函数)
  11. 影视App下载页源码
  12. protel元件封装总结
  13. oracle中asm是什么,什么是ASM?
  14. 从空间、时间和时空动力学角度研究大脑的动态特性
  15. 性能魔方七剑下天山之青干剑:CDN2.0,速度加快一倍,成本减少一半
  16. 某人将1000元存入银行 某公司需用一台设备 某企业为了建一项目 建设期3年,共贷款700万元
  17. 【转载】那个裸辞的程序员,后来怎么样了?
  18. dedecms联动筛选_织梦dedecms联动筛选[伪静态版]
  19. Android Studio使用技巧系列教程(二)
  20. 【12c】扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE

热门文章

  1. 互联网公司裁员潮传言四起,是捕风捉影还是确有其事?
  2. 磊科linux无线网卡驱动安装步骤,无线网卡驱动安装方法
  3. 为程序员准备的英语学习资料
  4. ups计算软件_一篇文章读懂UPS
  5. Python 玩出花儿了!一文教你用 Python 制作吃豆人游戏! | 附代码
  6. 虎虎生威—新年版本(鼠标超人、烟花、浮动会闪的星星以及闪避值拉满的老虎)
  7. MySQL 日期计算
  8. Markdown文件中图片自动转云图片和自动生成标题序号
  9. c语言辗转求最小公倍数,c语言:辗转相除法求最大公约数、最小公倍数
  10. Verilog HDL 实现 74HC595