我需要做快速准确的圆检测,所以我认为使用OpenCV的Hough Circle将是一个不错的选择。不幸的是,无论我给它的图像有多好以及我调整了多少参数,它都拒绝检测图像中的所有圆圈。这是我的输入图像:
我想检测每个圈子。首先,我通过滤色镜运行图像以提取灰色
frame = cv2.imread("new1.JPG")
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_gray = np.array([0, 0, 0], dtype=np.uint8)
upper_gray = np.array([100,100,100], dtype=np.uint8)
mask = cv2.inRange(frame, lower_gray, upper_gray)
res = cv2.bitwise_and(frame,frame, mask= mask)
gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 1, 255, cv2.cv.CV_THRESH_BINARY)
这给了我以下门槛,我认为这实际上非常好。
即使有这么好的门槛,圆圈检测充其量只是平庸。
circles = cv2.HoughCircles(thresh,cv2.cv.CV_HOUGH_GRADIENT,1,20,param1=50,param2=10,minRadius=2,maxRadius=15)
我应该使用另一种技术吗?我的轮廓效果非常好,但速度很慢。
答案 0 :(得分:3)
在尝试执行houghCircles方法之前,您可以尝试使用cv2.dilate(img,kernel)来加粗行。
处理噪声的一般方法是使用cv2.erode(img,kernel)来稀释白色,这样可以去除图像中的小像素。
内核只是像np.ones()这样的矩阵,但你可以尝试各种不同的矩阵,直到得到最有利的结果。
但是,不要期望计算机视觉能够100%做好工作,或者快速完成。如果你达到80%的高水平你做得很好(当然取决于实际的图像质量,我并不是说它不可能在油漆中绘制100%的图像)...