检测圆弧的问题

dokin1975 2021-03-01 12:27:16
我是一个OpenCV的初学者,目前在做的项目要求从图片中找出圆弧。我看见大家推荐用霍夫圆在图片中寻找圆弧,依样画葫写了一段代码,却发现只能找到一部分圆弧,另外一些部分怎么也识别不了。哪位大侠可以帮忙看看,是我用错了还是霍夫圆不适用于这种情况?不胜感激

代码:
# coding:utf-8

import cv2
import numpy as np

# 读源图
img = cv2.imread(r"D:\\1.jpg")
cv2.imshow('image', img)

# 预处理
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (17, 17), 0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
open_ = cv2.morphologyEx(blur, cv2.MORPH_OPEN, kernel)
edge = cv2.Canny(open_, 50, 100, apertureSize=3)

# 霍夫圆
circles = cv2.HoughCircles(edge, cv2.HOUGH_GRADIENT, 1, 30, param1=100, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles)) #把circles包含的圆心和半径的值变成整数
for i in circles[0, : ]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2) #画圆
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 2) #画圆心
cv2.imshow("circles", img)

# 退出
cv2.waitKey(0)
cv2.destroyAllWindows()

源图:


检测结果:只识别出三个,另外几个都没能识别出来。

...全文
269 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
一生要强的盆 2021-09-08
  • 打赏
  • 举报
回复 1

你这种需要检测圆形,你在形态学操作开运算的时候最好使用圆形结构元素,也就是MORPH_ELLIPSE;你用canny是来找轮廓的,霍夫圆只是在用轮廓拟合圆;你这张图的圆都有交集,直接这样找很难找到;建议形态学操作的时候用大一点的结构尺寸线腐蚀,让彼此分离,先得到质心,再去根据半径找圆

dokin1975 2021-03-02
  • 打赏
  • 举报
回复
引用 楼主 dokin1975的回复:
我是一个OpenCV的初学者,目前在做的项目要求从图片中找出圆弧。我看见大家推荐用霍夫圆在图片中寻找圆弧,依样画葫写了一段代码,却发现只能找到一部分圆弧,另外一些部分怎么也识别不了。哪位大侠可以帮忙看看,是我用错了还是霍夫圆不适用于这种情况?不胜感激

代码:
# coding:utf-8

import cv2
import numpy as np

# 读源图
img = cv2.imread(r"D:\\1.jpg")
cv2.imshow('image', img)

# 预处理
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (17, 17), 0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
open_ = cv2.morphologyEx(blur, cv2.MORPH_OPEN, kernel)
edge = cv2.Canny(open_, 50, 100, apertureSize=3)

# 霍夫圆
circles = cv2.HoughCircles(edge, cv2.HOUGH_GRADIENT, 1, 30, param1=100, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles)) #把circles包含的圆心和半径的值变成整数
for i in circles[0, : ]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2) #画圆
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 2) #画圆心
cv2.imshow("circles", img)

# 退出
cv2.waitKey(0)
cv2.destroyAllWindows()

源图:


检测结果:只识别出三个,另外几个都没能识别出来。
自己顶一个看看

4,270

社区成员

发帖
与我相关
我的任务
社区描述
OpenCV相关技术交流专区
计算机视觉人工智能opencv 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • OpenCV
  • 幻灰龙
  • OpenCV中国团队
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

OpenCV中国团队官方博客:https://blog.csdn.net/opencvchina

试试用AI创作助手写篇文章吧