Python+OpenCV识别Halcon标定板圆并将圆⼼坐标写⼊⽂件话不多说直接上图:
直接上代码:
# 加载环境包
import cv2
import numpy as np
# from PIL import  Image
writelines()方法将什么写入文件# 图⽚简单处理
img = cv2.imread('C:\\Users\\Tony.Hsu\\Desktop\\hh_08.bmp')# 读取图⽚
GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 灰度化
GrayImage = dianBlur(GrayImage,25)# 中值模糊,medianBlur()函数使⽤中值滤波器来平滑图像。
# 阈值处理,输⼊图⽚默认为单通道灰度图⽚
ret, th1 = cv2.threshold(GrayImage,127,255, cv2.THRESH_TOZERO)# 固定阈值⼆值化
# threshold为固定阈值⼆值化
# 第⼆参数为阈值
# 第三参数为当像素值超过了阈值(或者⼩于阈值,根据type来决定),所赋予的值(⼀般情况下,都是256⾊,所以默认最⼤为255)
# thresh_binary是基于直⽅图的⼆值化操作类型,配合threshold⼀起使⽤。此外还有cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV;
# cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
th2 = cv2.adaptiveThreshold(GrayImage,255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,5)
# adaptiveThreshold⾃适应阈值⼆值化,⾃适应阈值⼆值化函数根据图⽚⼀⼩块区域的值来计算对应区域的阈值,从⽽得到也许更为合适的图⽚。# 第⼆参数为当像素值超过了阈值(或者⼩于阈值,根据type来决定),所赋予的值(⼀般情况下,都是256⾊,所以默认最⼤为255)
# 第三参数为阈值计算⽅法,类型有cv2.ADAPTIVE_THRESH_MEAN_C,cv2.ADAPTIVE_THRESH_GAUSSIAN_C
# 第四参数是基于直⽅图的⼆值化操作类型,配合threshold⼀起使⽤。此外还有cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV;
# cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
# 第五参数是图⽚中分块的⼤⼩
# 第六参数是阈值计算⽅法中的常数项
th3 = cv2.adaptiveThreshold(GrayImage,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,5)
# 同上
kernel = np.ones((6,9), np.uint8)# 创建全⼀矩阵,数值类型设置为uint8
erosion = de(th2, kernel, iterations=1)# 腐蚀处理
dilation = cv2.dilate(erosion, kernel, iterations=1)# 膨胀处理
imgray = cv2.Canny(erosion,30,100)# Canny算⼦边缘检测
# cv2.imshow("s", dilation)
circles = cv2.HoughCircles(imgray, cv2.HOUGH_GRADIENT,1,40, param1=100, param2=5.5, minRadius=8,
maxRadius=10)# 霍夫圆变换
# 第3参数默认为1
# 第4参数表⽰圆⼼与圆⼼之间的距离(太⼤的话,会很多圆被认为是⼀个圆)
# 第5参数默认为100
# 第6参数根据圆⼤⼩设置(圆越⼩设置越⼩,检测的圆越多,但检测⼤圆会有噪点)
# 第7圆最⼩半径
# 第8圆最⼤半径
circles = np.uint16(np.around(circles))
# np.uint16数组转换为整数,16位,0-65535
# np.around返回四舍五⼊后的值
P = circles[0]# 去掉circles数组⼀层外括号
for i in P:
# 画出外圆
cv2.circle(img,(i[0], i[1]), i[2],(0,255,0),2)# 第⼆参数()内是圆⼼坐标,第三参数是半径,第四参数()内是颜⾊,第五参数是线条粗细# 画出圆⼼
cv2.circle(img,(i[0], i[1]),2,(0,0,255),3)
print("圆的个数是:")
print(len(P))
# 打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。fresult =open('C:\\Users\\Tony.Hsu\\Desktop\\','w')
for i in P:
r =int(i[2])
x =int(i[0])
y =int(i[1])
print("圆⼼坐标为:",(x, y))
# 将圆⼼写⼊⽂件
fresult.writelines("圆⼼坐标为:("+str(i[0])+","+str(i[1])+")"+"\n")
print("圆的半径是:", r)
cv2.imshow('detected circles', img)# 第⼀参数为窗⼝名称
cv2.waitKey(0)# ⽆穷⼤等待时间
cv2.destroyAllWindows()
注释:
"""
腐蚀
kernel,                  # 卷积核
dst=None,
anchor=None,
iterations=None,        # 迭代次数,默认1
borderType=None,
borderValue=None)
膨胀
cv2.dilate(src,                      #输⼊图像
kernel, dst = None, anchor = None,
iterations = None          #迭代次数,默认1
borderType = None,
borderValue = None)
"""

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。