检测圆形形状opencv

Detect circle like shapes opencv

各位,我是 OpenCV 和计算机视觉的新手,我被困在这个问题上,这似乎是一个相当微不足道的问题,但请原谅我的菜鸟 :)

我正在尝试从横截面图像中检测钢筋。

我正在使用此代码:

import cv2
import cv2.cv as cv
import numpy as np

img = cv2.imread('test/t2.jpg',0)
img = cv2.equalizeHist(img)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=25)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是我目前得到的结果,不太好:

我正在寻找有关如何处理此问题以及如何了解更多关于 CV 的指导,因为我真的很感兴趣!

非常感谢!

HoughCircles 不足以检测像您的情况这样复杂的图像中的圆圈。

SO 已经对此进行了一些讨论。您可以参考这些 post 和质量可接受的答案

标准方式:

Filled circle detection using CV2 in Python?

What are the possible fast ways to detect circle in an image?

噪声图像:

https://dsp.stackexchange.com/questions/5930/find-circle-in-noisy-data

另一种方法:

Gradient Pair Vectors

Learning Automata

通过在这一行中更好地设置参数,可以稍微改善这些结果:

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=25)

比如可以稍微减小maxRadius,提高灵敏度。

但是,根据我的经验,您不会在这样的图像上获得好的结果。它非常复杂,圆圈不规则且角度不同。如果您的目标是练习,那么当然可以使用参数并尝试不同的方法来改进它。虽然我没有看到太多实际用途。

您可以在此处使用模块 trackpy 检测特征。您需要使用奇数来改变特征尺寸,并查看哪一个最匹配。您可能还需要进行一些预处理,例如将图像转换为灰度。

import trackpy as tp
import numpy as np
import pandas as pd
import pims
import matplotlib.pyplot as plt

#%% importing the data
frames=pims.ImageSequence('F:/TrapHysteresis/processing/Positions/*.TIF')

#%% tracking circles and center positions
featuresize=71
f1=tp.locate(frames[0],featuresize)

plt.figure()
tp.annotate(f1,frames[0])