IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【OpenCv】检测黑白棋 -> 正文阅读

[人工智能]【OpenCv】检测黑白棋

环境

  • 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()
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:21:38  更:2022-03-16 22:24:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:28:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码