Python+OpenCV实现单个圆形孔和针检测
OpenCV是一个流行的计算机视觉库,可以用于图像处理和分析。本攻略将介绍如何使用Python和OpenCV实现单个圆形孔和针的检测,并提供两个示例。
步骤一:导入必要的库和模块
我们导入OpenCV库和Py库,以及一些其他必要的库和模块。下面是导入这些库和模块的代码:
import cv2
import numpy as np
步骤二:检测单个圆形孔
我们可以使用OpenCV检测单个圆形孔。下面是一个检测单个圆孔的示例:
# 读取图像
img = cv2.imread('circle_hole.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny边缘检测
edges = cv2.Canny(blur, 50, 150)
# Hough圆检测
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# 绘制检测到的圆形孔
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 显示结果
cv2.imshow("Circle Hole Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,我们首先使用cv2.imread
函数读取图像,并使用cv2.cvtColor
函数将其转换为灰度图像。然后,我们使用cv2.GaussianBlur
函数对图像进行高斯滤波,使用cv2.Canny
函数进行边缘检测。接下来,我们使用cv2.HoughCircles
函数进行圆检测,并使用cv2.circle
函数绘制检测到的圆形孔。最后,我们使用cv2.imshow
函数显示结果。
示例一:检测单个圆形孔
下面是一个检测单个圆形孔的完整代码:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('circle_hole.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny边缘检测
edges = cv2.Canny(blur, 50, 150)
# Hough圆检测
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# 绘制检测到的圆形孔
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 显示结果
cv2.imshow("Circle Hole Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,我们首先使用cv2.imread
函数读取图像,并使用cv2.cvtColor
函数将其转换为灰度图像。然后,我们使用cv2.GaussianBlur
函数对图像进行高斯滤波,使用cv2.Canny
函数进行边缘检测。接下来,我们使用cv2.HoughCircles
函数进行圆检测,并使用cv2.circle
函数绘制检测到的圆形孔。最后,我们使用cv2.imshow
函数显示结果。
步骤三:检测单个针
我们可以使用OpenCV检测单个针。下面是一个检测单个针的示例:
# 读取图像
img = cv2.imread('needle.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny边缘检测
edges = cv2.Canny(blur, 50, 150)
# Hough线检测
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
# 绘制检测到的针
if lines is not None:
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 0 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示结果
cv2.imshow("Needle Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中我们首先使用cv2.imread
函数读取图像,并使用cv2.cvtColor
函数将其转换为灰度图像。然后,我们使用cv2.GaussianBlur
函数对图像进行高斯滤波,使用cv2.Canny
函数进行边缘测。接下来,我们使用cv2.HoughLines
函数进行线检测,并使用cv2.line
函数绘制检测到的针。最后,我们使用cv2.imshow
函数显示结果。
示例二:检测单个针
下面是一个检测单个针的完整代码:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('needle.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny边缘检测
edges = cv2.Canny(blur, 50, 150)
# Hough线检测
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
# 绘制检测到的针
if lines is not None:
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 0 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示结果
cv2.imshow("Needle Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中我们首先使用cv2.imread
函数读取图像,并使用cv2.cvtColor
函数将其转换为灰度图像。然后,我们使用cv2.GaussianBlur
函数对图像进行高斯滤波,使用cv2.Canny
函数进行边缘测。接下来,我们使用cv2.HoughLines
函数进行线检测,并使用cv2.line
函数绘制检测到的针。最后,我们使用cv2.imshow
函数显示结果。
总结
本攻略介绍了如何使用Python和OpenCV实现单个圆形孔和针的检测,并提供了两个示例。使用cv2.imread
函数读取图像,使用cv2.cvtColor
函数将其转换为灰度图像,使用cv2.GaussianBlur
函数进行高斯滤波,使用cv2.Canny
函数进行边缘检测,使用cv2.Houghircles
函数进行圆检测,使用cv2.HoughLines
函数进行线检测,使用cv2.circle
函数和cv2.line
函数绘制检到的圆形孔和针。这些操作可以帮助我们在Python实现图像处理和分析。提供了两个示例,分别检测了单个圆形孔和单个针。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+OpenCV实现单个圆形孔和针检测 - Python技术站