python黑洞网 首页 博客 问答 公众号 答疑 pdf 视频 游戏 脚本 实战 其它资源
写博客 登录 注册

程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网: it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(1)

OpenCV——硬币检测与计数的设计实现

发布于2020-09-28 21:45     阅读(2250)     评论(0)     点赞(17)     收藏(2)


1、阈值分割

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 使用函数cv2.threshold()进行简单的阈值处理
  5. 函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst
  6. 返回值
  7. retval:当前用来对像素值进行分类的低阈值,默认情况下和参数thresh相等
  8. dst:二值化处理后的图像,像素值中只存在0或255
  9. 参数解析:
  10. src:需要二值化的原图像,必须是灰度图,传入一种彩色图没有意义;
  11. thresh:用来对像素值进行分类的阈值;
  12. maxval:就是当像素值高于,有时是小于阈值时应该被赋予的新的像素值;
  13. type:阈值处理方式,OpenCV提供多种阈值处理方法
  14. cv2.THRESH_BINARY:超过阈值部分取maxval(最大值),否则取0
  15. cv2.THRESH_BINARY_INV :THRESH_BINARY的反转
  16. cv2.THRESH_TRUNC :大于阈值部分设为阈值,否则不变
  17. cv2.THRESH_TOZERO :大于阈值部分不改变,否则设为0
  18. cv2.THRESH_TOZERO_INV :THRESH_TOZERO的反转
  19. """
  20. import cv2
  21. '1. 初始操作'
  22. src = cv2.imread("Resources/threshold.png", 17)
  23. img = src.copy()
  24. '2. 灰度化——cvtColor()参数含义:1)原图 2)目标颜色空间,例如 RGB->HSV'
  25. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  26. cv2.imshow("gray", gray)
  27. '3. 阈值分割(二值化)——threshold()参数含义:1)8位图像(灰度图) 2)比较阈值 3)输出值 4)分割属性'
  28. '返回值函数: ret=比较阈值 thresh=二值化图像(矩阵数组)'
  29. ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
  30. print(ret)
  31. '4. 完成显示'
  32. cv2.imshow("src Image", src)
  33. cv2.imshow("thresh Image", thresh)
  34. cv2.waitKey()

2、腐蚀与膨胀,开运算与闭运算

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 腐蚀操作:
  5. 原理:
  6. 比如使用一个3X3的全一矩阵去腐蚀一张灰度图,中心锚点的值就会被替换为对应核中最小的值
  7. 原始数据:
  8. [[100 127 127 127 127]
  9. [127 127 127 127 127]
  10. [127 127 127 127 127]
  11. [127 127 127 100 127]
  12. [127 127 127 127 127]]
  13. ************************************************************
  14. 腐蚀之后的数据
  15. [[100 100 127 127 127]
  16. [100 100 127 127 127]
  17. [127 127 100 100 100]
  18. [127 127 100 100 100]
  19. [127 127 100 100 100]]
  20. erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
  21. 参数解析:
  22. kernel:腐蚀操作的内核。 可以使用函数getStructuringElement()。
  23. anchor:默认为-1表示内核中心点,省略时为默认值
  24. iterations:腐蚀次数。省略时为默认值1
  25. borderType:推断边缘类型,具体参见borderInterpolate函数。默认值为边缘值拷贝
  26. borderValue:边缘填充值,具体可参见createMorphoogyFilter函数,可省略,默认为0
  27. dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
  28. 参数解析:
  29. anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  30. iterations:膨胀次数。省略时为默认值1。
  31. borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT, 边缘拷贝
  32. borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。
  33. """
  34. '''
  35. 腐蚀与膨胀
  36. '''
  37. # import cv2
  38. #
  39. # '1. 初始操作'
  40. # src = cv2.imread("Resources/otsu_src.jpg", 17)
  41. #
  42. # '2. 获得形态学变换的【结构元】——ELLIPSE=椭圆形 RECT=矩形 CROSS=交叉形'
  43. # kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
  44. #
  45. # '3. 腐蚀——erode()参数含义:1)原图 2)结构元 iterations=次数'
  46. # er = cv2.erode(src, kernel, iterations=1)
  47. #
  48. # '4. 膨胀——dilate()参数含义:1)原图 3)结构元 iterations=次数'
  49. # di = cv2.dilate(er, kernel, iterations=1)
  50. #
  51. # '5. 完成显示'
  52. # cv2.imshow("src Image", src)
  53. # cv2.imshow("erode Image", er)
  54. # cv2.imshow("dilate Image", di)
  55. # cv2.waitKey(0)
  56. ######################################################
  57. '''
  58. 开操作与闭操作
  59. 开操作 = 腐蚀 + 膨胀 消除部分高亮区域(二值化中的白色区域)
  60. 闭操作 = 膨胀 + 腐蚀 消除高亮区域的内部黑洞(二值化中的黑色区域)
  61. '''
  62. import cv2
  63. '1. 初始操作'
  64. src = cv2.imread("Resources/open.png", 0)
  65. img = src.copy()
  66. '2. 二值化——threshold'
  67. ret, thresh = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)
  68. cv2.imshow('thresh', thresh)
  69. '3. 获取形态学变换结构元——RECT=矩形'
  70. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
  71. '4. 形态学变换函数——morphologyEx()参数含义:1)原图 2)变换属性(开/关操作、礼帽、梯度等) 3)结构元 '
  72. open = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel, iterations=2)
  73. # op_erode = cv2.erode(src, kernel, iterations=1)
  74. # open = cv2.dilate(op_erode, kernel, iterations=1)
  75. '5. 完成显示'
  76. cv2.imshow("Src Image ", img)
  77. cv2.imshow("MORPH_OPEN Image", open)
  78. cv2.waitKey(0)

 

3、硬币检测与计数的应用实现

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 项目主题:硬币检测和计数的设计与实现
  5. """
  6. import cv2
  7. import numpy as np
  8. def stackImages(scale, imgArray):
  9. """
  10. 将多张图像压入同一个窗口显示
  11. :param scale:float类型,输出图像显示百分比,控制缩放比例,0.5=图像分辨率缩小一半
  12. :param imgArray:元组嵌套列表,需要排列的图像矩阵
  13. :return:输出图像
  14. """
  15. rows = len(imgArray)
  16. cols = len(imgArray[0])
  17. rowsAvailable = isinstance(imgArray[0], list)
  18. width = imgArray[0][0].shape[1]
  19. height = imgArray[0][0].shape[0]
  20. if rowsAvailable:
  21. for x in range(0, rows):
  22. for y in range(0, cols):
  23. if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
  24. imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
  25. else:
  26. imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),
  27. None, scale, scale)
  28. if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
  29. imageBlank = np.zeros((height, width, 3), np.uint8)
  30. hor = [imageBlank] * rows
  31. hor_con = [imageBlank] * rows
  32. for x in range(0, rows):
  33. hor[x] = np.hstack(imgArray[x])
  34. ver = np.vstack(hor)
  35. else:
  36. for x in range(0, rows):
  37. if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
  38. imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
  39. else:
  40. imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, scale)
  41. if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
  42. hor = np.hstack(imgArray)
  43. ver = hor
  44. return ver
  45. '1. 初始操作'
  46. src = cv2.imread("Resources/coin2.jpg")
  47. img = src.copy()
  48. '2. 图像预处理——灰度化'
  49. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  50. '3. 图像预处理——二值化'
  51. ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
  52. '4. 图像预处理——消除特有噪声(形态学变换)'
  53. # kernel = np.ones((3, 3), np.uint8)
  54. kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
  55. dilate = cv2.morphologyEx(thresh, cv2.MORPH_DILATE, kernel, iterations=2)
  56. opening = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel, iterations=3)
  57. '根据距离变换的性质,经过简单的运算,即可用于细化字符的轮廓和查找物体质心(中心)。'
  58. '5. 寻找前景区域——分离连接物体distanceTranform()参数含义:1)二值图像 2)距离变换类型 3)距离变换的掩膜模板'
  59. # DIST_L2:简单欧几里得距离 Δ = sqrt((x1 - x2)² + (y1 - y2)²)
  60. dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 3)
  61. '6. 找到未知区域'
  62. ret, sure_fg = cv2.threshold(dist_transform, 0.5 * dist_transform.max(), 255, 0)
  63. print(ret)
  64. sure_fg = np.uint8(sure_fg)
  65. '7. 找到硬币中心(轮廓查找)findContours()参数含义:1)8位图像 2)轮廓查找模式 3)查找近似方法'
  66. contours, hierarchy = cv2.findContours(sure_fg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2:]
  67. '8. 绘制硬币中心(轮廓绘制)drawContours()参数含义:1)原图 2)轮廓点坐标 3)轮廓索引 4)线条颜色 5)线条粗细'
  68. cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
  69. '9. 完成显示'
  70. '''
  71. *知识点回顾:
  72. putText()参数含义:1)图像 2)需显示的文本 3)坐标 4)文本字体 5)文本尺寸百分比 6)文本颜色 7)文本粗细
  73. '''
  74. cv2.putText(img, "count:{}".format(len(contours)), (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 3)
  75. cv2.putText(src, "srcImg", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 3)
  76. cv2.putText(gray, "gray", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 3)
  77. cv2.putText(thresh, "thresh", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 3)
  78. cv2.putText(opening, "open", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 3)
  79. cv2.putText(sure_fg, "fg", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 3)
  80. imgStack = stackImages(0.7, ([src, gray, thresh], [opening, sure_fg, img]))
  81. cv2.imshow("imgStack", imgStack)
  82. cv2.waitKey(0)

原文链接:https://blog.csdn.net/weixin_45602979/article/details/108831760

程序员说:42岁了,突然觉得研发前途渺茫

中国程序员数量达755万,全球排名第二

为什么都说程序员找不到女朋友,但是身边程序猿的却没一个单身的?

程序员说:30岁以上你还死磕技术,别说拿高薪,可能你连饭碗都会保不住

程序员被开除,老板:“有你参与的项目全黄了!”

笑话:一个测试工程师走进一家酒吧

笑话:面试官:请拿出一段体现你水平的代码。我: sudo rm -rf /*面试官:这体现了你哪方面能力?

python精选:Python 办公实战!​按姓名拆分 Excel 为单独文件,微信自动发给相应联系人

网友说:做开发,不被领导喜欢怎么办?

网友说:我奉劝各位,一定不能在职场透露自己的家庭条件



所属网站分类: 技术文章 > 博客

作者: 滴水

链接: https://www.pythonheidong.com/blog/article/551450/c282479e13168c62caff/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)




站长公众号(new) 更多>

程序员说:42岁了,突然觉得研发前途渺茫

中国程序员数量达755万,全球排名第二

为什么都说程序员找不到女朋友,但是身边程序猿的却没一个单身的?

程序员说:30岁以上你还死磕技术,别说拿高薪,可能你连饭碗都会保不住

程序员被开除,老板:“有你参与的项目全黄了!”

笑话:一个测试工程师走进一家酒吧

笑话:面试官:请拿出一段体现你水平的代码。我: sudo rm -rf /*面试官:这体现了你哪方面能力?

python精选:Python 办公实战!​按姓名拆分 Excel 为单独文件,微信自动发给相应联系人

网友说:做开发,不被领导喜欢怎么办?

网友说:我奉劝各位,一定不能在职场透露自己的家庭条件

pdf(new) 更多>

git常用命令pdf下载

《从零开始学Python网络爬虫》PDF高清版免费下载

《Python游戏编程快速上手 》PDF高清版免费下载

【每日书籍推荐】PYTHON 项目开发实战_超高清PDF

《父与子的编程之旅:与小卡特一起学Python》PDF高清版免费下载

《Effective Python》pdf高清版下载

【每日推荐书籍】《Python3网络爬虫开发实战》

【每日一本书】《Python编程快速上手 让繁琐工作自动化》

《Python从小白到大牛》PDF高清版 免费下载

《Python编程:从入门到实践(第2版)》

脚本(new) 更多>

五年级同学BMI指数计算器

用python做---,pythonos2.2.0-1版

使用Discord.py个人号创建Discord Bot 提示 401 Unauthorized

新手训练短语

opencv实现视频截取

python练习题

用python画国旗

抖音最火表白代码下载

python文件解压脚本

python分类文件脚本下载

博客(new) 更多>

Python使用Matplotlib库绘制双y轴图形(柱状图+折线图)

Python中使用matplotlib时显示中文乱码_(或更改字体)

Python 列表 pop()函数使用详解

17 Python的os模块

Python皮卡丘

Python提取JSON格式数据

python 爱心代码

python萌新爬虫学习笔记【建议收藏】

【2023华为杯F题】强对流降水临近预报(Python&Matlab代码分享)

warning: retrying (retry(total=4, connect=none, read=none, redirect=none, st

视频(new) 更多>

2020最新_Python_(MySQL_SQL_Redis)数据库详解【千锋】

2019版-千锋Python语法-视频

2019千锋Python爬虫全套视频(最经典)

13天搞定Python分布爬虫 视频教程

python办公自动化

python深度学习系列教程

python视频 神经网络 Tensorflow 模块 视频教程

初级Python视频教程 云盘

初级Python视频教程推荐

python视频各种视频很多

实战(new) 更多>

韩顺平TCP网络文件传输课程代码word下载

基于python的ARP扫描与断网攻击的图形化脚本

bootstrap-datetimepicker搞了一天也不显示,请教!

这个项目是人人网的爬虫程序

这是一个利用Python分析一个json数据,并可视化输出结果的小项目

一个Mp3播放器 Python项目实战

一个自动发送邮箱验证码的小项目 源码下载

python 加密解密的程序 .py下载

PYTHON实现计算机功能

PYTHON定时关机

问答(new) 更多>

modbus tcp 与王鸽 RTU5026

如何在数据框中创建新列以根据 Python Pandas 中的日期列对每个 id 的值进行排序?[复制]

索引/数组故障排除:家庭作业

Pytorch安装

mysql.connector.errors.InterfaceError:执行操作失败;

如何将发出请求的用户分配给 Django 模型中的外键字段

如何在 python 中将日期时间格式化为字符串“yyyy-MM-dd'T'HH:mm:ss.SSSZ'”格式

如何使用 PyQt 信号发出 64 位无符号整数

如何在Android上使用“pyqtdeploy”Windows pyqt5?[关闭]

将数据(超过 1 点)添加到绘图破折号中的现有迹线

游戏(new) 更多>

用python写滑雪游戏 源码下载

用python写乒乓球游戏 源码下载

python吃豆子小游戏 源码下载

外星人入侵 python小游戏源码下载

帅哥吃苹果 python小游戏源码下载

小恐龙快跑 python小游戏源码下载

python小游戏拼图源码下载

风筝 python小游戏源码下载

迷宫-python小游戏源码下载

python小游戏 life

其他资源(new) 更多>

王道机试

python做乘法口诀表

纯净版python 3.7开发环境安装包

视觉SLAM十四讲 - 从理论到实践

Python正则表达式教程下载

Vue+Go前端后端一体化 企业级微服务网关项目

尚硅谷java基础入门视频下载

尚硅谷java基础入门视频

超基础初一生反utPython程序(只是一个文本)

注册表实用手册


深圳SEO优化公司光明网络营销荆州百度网站优化公司松原高端网站设计推荐塘坑seo网站优化哪家好襄樊网站优化推广报价沈阳网站推广工具哪家好渭南网络广告推广公司崇左企业网站建设多少钱烟台外贸网站制作价格萍乡网站优化按天扣费价格十堰建站价格黔南设计网站报价黔南英文网站建设多少钱中山关键词按天计费价格汉中关键词排名包年推广多少钱朝阳企业网站改版多少钱荷坳关键词按天收费哪家好怀化网页设计多少钱大鹏关键词按天计费兰州优化报价池州外贸网站制作推荐张掖推广网站黄南百度seo报价黄山高端网站设计推荐河池推广网站报价玉溪网站seo优化郴州网络推广哪家好海东英文网站建设价格坑梓seo优化公司昭通百姓网标王推广推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化