中国象棋局面识别 -2.象棋棋子的识别

上一节实现了天天象棋的棋盘的识别。主要是横与纵坐标的提取。

这一节就要开始实现棋子的识别了。这个是用到霍夫圆检测。上次用的是霍夫直线检测。看来这个霍夫实在是个牛人啊。于是顺便查了下这人,了解一下:

霍夫变换(Hough Transform)是由1959年Paul Hough通过当时气泡室照片的机器创造的,他本人也在1962年获得了美国的专利,专利名为:用于识别复杂图案的方法。

霍夫圆检测没什么花头。主要是这个函数的参数要理解并正确使用,这样能比较精准地定位到该识别的圆。包括最小最大半径的设置。各个圆心的间距的设置。这样可以排除掉杂毛(比如棋子的阴影部分,它也是会识别出圆的。但因为这个圆的圆心与棋子的圆心距离过近,于是被排除了。)

img = cv.imread(file_name)
img = img[600:1800,20:1060] # 切割一下

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

# 模糊处理,不管是用mediaBlur还是GaussianBlur, 实际发现这不是必要的。用霍夫圆检测,直接使用灰度图也一样能找出来,可能棋子的圆相对规范的原因?
#blur = cv.medianBlur(gray, 5)
#gaus = cv.GaussianBlur(gray,(3,3),0)

maxRadius=int(width/9/2) # 棋盘宽度除以9 (横向最多就放9个棋子, 再除2 就是半径啦)
minRadius=int(0.8* width/9/2)
minDist = int(0.8 * width/9)  # 棋子与棋子间距,最小就是2个半径也就是直径。考虑误差,X0.8放宽一下条件

# 检测圆形, 参数的设置很重要。它决定了哪些圆命中出来。参数设置有最小最大半径,以及各圆心间距等
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, minDist, param1=50, param2=30, minRadius=minRadius, maxRadius=maxRadius)

再用代码把这些识别到的圆画在原图上,方便核对检测效果

# 绘制圆形
if circles is not None:

    circles = np.round(circles[0, :]).astype("int")
    print("Total circles", len(circles))
    
    for idx, (x, y, r) in enumerate(circles):  # index 用来后面存图片比对用的
        R = r
        cv.circle(img, (x, y), r, (0, 255, 0), 2)

最后的检测效果如图

你可能感兴趣的:(计算机视觉,opencv,人工智能)