环境

  • Python 3.8.8
  • Pycharm 2021
  • opencv-Python

效果

基本原理

圆检测的原理是在直线检测原理上的拓展,可以先看看我这篇博客霍夫直线检测下面介绍圆检测的不同之处。
圆的表达式如下:
( x − a ) 2 + ( y − b ) 2 = r (x-a)^2+(y-b)^2=r (x−a)2+(y−b)2=r
其中 a a a和 b b b表示圆心坐标, r r r表示圆半径,因此标准佛如霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆检测,此时效率就会很低,所以 O p e n C v OpenCv OpenCv中使用 霍夫梯度 进行圆形的检测。霍夫梯度法将圆检测分成两个阶段,第一阶段是检测圆心,第二段是利用圆心推导出圆半径,公式如下:
a = x − r c o s θ b = y − r s i n θ a = x - rcos\theta \\ b = y - rsin\theta a=x−rcosθb=y−rsinθ

  • 圆心检测的原理:圆心是圆周角法线的交汇处,设置一个阈值,在某点的相交的直线的条数大于这个阈值就认为该交汇点为圆心。
  • 圆半径确定原理:圆心到圆周上的距离(半径)是相同的,确定一个阈值,只要相同距离的数量打于该阈值,就认为该距离是该圆心的半径。

API

HoughCircles(image, method, dp, minDist,param1=100, param2=100, minRadius=0, maxRadius=0 )

  • method: CV_HOUGH_GRADENT
  • dp:累加面分辨率(大小) = 原始图像分辨率(大小) × 1 / dp。默认 dp = 1 时,两者分辨率相同。
  • minDist: 两个圆心的最小距离。若两圆心距离 < minDist,则认为是同一个圆
  • param1: canny边缘检测高阈值, 低限阈值是这个值的一半。越大检测圆边界时,要求的亮度梯度越大,一些灰灰的不明显的边界就会略去。
  • param2:累加平面某点是否是圆心的判定阈值。越小,越多假的圆会被检测到,越大,能通过检测的圆就更接近完美的圆形,默认为 100。
  • 后两个参数:允许检测到的圆的最大和最小半径。

完整代码

import cv2 as cv
import numpy as np
import copy#黑白棋子用不同颜色进行检测
def circle_detect() :img = cv.imread('images/weiqi.png')cimg = copy.deepcopy(img)img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# img_gray = cv.GaussianBlur(img_gray, (5, 5), 0)#降噪img_gray = cv.medianBlur(img_gray, 5)circles = cv.HoughCircles(img_gray, cv.HOUGH_GRADIENT, 1, 10, param1 = 120, param2 = 50).squeeze()for circle in circles :#转成np.uint16数据类型扩大数据范围circle = np.uint16(np.around(circle))#做二值化处理,白棋为白,黑棋为黑,若圆心的值为255则为白棋,否则为黑棋_, img_thresh = cv.threshold(img_gray, 80, 255, cv.THRESH_BINARY)#注意x和y与w和h的对应if img_thresh[circle[1], circle[0]] == 255 :print(f'chess is black!')# 画出检测到的圆cv.circle(img, center=(circle[0], circle[1]), radius=circle[2],color=(255, 0, 0), thickness=2)# 画出圆心cv.circle(img, center=(circle[0], circle[1]), radius=2,color=(255, 0, 0), thickness=3)else :print('chess is white!')# 画出检测到的圆cv.circle(img, center=(circle[0], circle[1]), radius=circle[2],color=(0, 0, 255), thickness=2)# 画出圆心cv.circle(img, center=(circle[0], circle[1]), radius=2,color=(0, 0, 255), thickness=3)cv.imshow('canny', img_thresh)print(img.shape, cimg.shape)img_concatenate = np.concatenate((cimg, img), axis = 1)cv.imwrite('img_con.png', img_concatenate)cv.imshow('img', img_concatenate)cv.waitKey(0)if __name__ == '__main__':circle_detect()

【OpenCv】检测黑白棋相关推荐

  1. opencv检测矩形

    参考:使用OpenCV检测图像中的矩形_知来者逆的博客-CSDN博客_opencv检测图像中的矩形 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. ( ...

  2. 人工智能.黑白棋规则

    游戏定义很简单.黑白棋规则不在这里说了. 程序设计 假设要是我写黑白棋的程序就用一个string 的二维数组qipan[9][9]搞定了.A B两个人轮流下. qipan[][]=b w n//(bl ...

  3. 黑白棋(Othello)

    其实这篇学习总结应该早就要写的,但是对技术博客确实把握的不到位,总觉得语言不够生动,表达也略显牵强,除了贴几行代码,中间的技术点就透漏的不太多了,经过一个多月的沉沦之后,这篇本来要被毙掉的心得又被我拿 ...

  4. [Python] 黑白棋(翻转棋)小游戏

    [Python] 黑白棋(翻转棋)小游戏 游戏介绍 黑白棋(Reversi or Othello)在西方和日本很流行.游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负. 规则 黑白棋的每颗 ...

  5. Python 实现黑白棋

    Python实现黑白棋 题目要求 电脑的策略 游戏结束的条件 解题思路 关键逻辑 关键函数 Init_board: printBoard: computer_move: human_move: che ...

  6. 人工智能导论实验2——野人渡河黑白棋问题

    人工智能导论实验2--野人渡河&黑白棋问题 实验目的及要求: 本项目要求能够理解人工智能的基本原理,理解状态空间的概念.原理和方法,掌握用状态空间表示问题的步骤,掌握搜索方法的基本原理,并能够 ...

  7. C++——黑白棋(落子)

     黑白棋(落子) 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 经过前3题的热身相信大家已经对黑白棋有了一定的认识,下面我们来编写稍微复杂一点的模块.黑白棋并不像5子棋 ...

  8. 深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略)

    深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略) 文章目录 深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略) 黑白棋规则 传统黑白棋策略 蒙特卡洛搜索树 ...

  9. 蒙特卡洛树搜索-黑白棋(一):黑白棋介绍及棋盘类

    这是关于蒙特卡洛树搜索解决黑白棋问题的文章,如果你不了解蒙特卡洛树搜索,参看蒙特卡洛树搜索 文章目录 1. 黑白棋简介 2. 游戏规则 3. 棋盘类 4.函数具体实现 5. 测试 1. 黑白棋简介 黑 ...

最新文章

  1. Linux soft lockup分析
  2. 延迟放学,让“996父母”松了口气
  3. Oracle-使用切片删除的方式清理非分区表中的超巨数据
  4. LintCode刷题——不同的二叉查找树I、II
  5. 既约分数蓝桥杯c语言,2021蓝桥杯C++第二届省赛
  6. Centos 安装 JDK8
  7. 修改 JSON 对象的值
  8. Java 代码性能优化总结
  9. Codeforces Round #187 (Div. 2) D
  10. 新中新电子f200a驱动安装_【电子税务局】出口退税功能上线指引
  11. nagios监控详解
  12. ieee期刊的科技写作思路曹文平_如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?...
  13. C++ 小游戏 视频及资料集(9)
  14. grldr文件引导windows xp、ubuntu系统
  15. [JavaScript]45 Fresh Useful JavaScript and jQuery Techniques and Tools
  16. ESP8266调用心知天气API
  17. 中通快递宣布全球发售定价
  18. 米家Zigbee系列传感器软件设计总结
  19. 据说是原CSDN排名第一的博客,我看到内容,确实被震憾了
  20. 【常见问题】Waki_谢老师B站的HCNP/HCIP课程第27集的华为eNSP路由器配置问题——百兆口不能添加IP地址

热门文章

  1. 狂神说笔记——SpringCloud快速入门23
  2. 微信如何批量删除聊天记录?分享超全的删除方案!
  3. android 闪屏拉伸,App设计体系之引导页/启动页/闪屏
  4. 关于我的第二个程序——黑白棋
  5. Jquery轮播图,点击左右按钮进行轮播
  6. java datetime和date_数据库时间和java时间转换 datetime与date转化
  7. 【Python】Jupyter .ipynb
  8. Java迭代器iterator遍历有条件删除对象
  9. 带你批量采集块首视频进行搬运
  10. 分享一些缓解颈椎疼痛的方法