python滑动条来设置阈值houghcircle,使用opencv和python-进行HoughCircles圆检测

I am trying to use OpenCV's (Hough)Circle detection to.. detect circles. I created a solid circle on a black background, tried to play with the parameters, used blur and everything, but I am just not able to make it find anything.

Any ideas, suggestions etc. would be great, thank you!

my current code is something like this:

import cv2

import numpy as np

"""

params = dict(dp=1,

minDist=1,

circles=None,

param1=300,

param2=290,

minRadius=1,

maxRadius=100)

"""

img = np.ones((200,250,3), dtype=np.uint8)

for i in range(50, 80, 1):

for j in range(40, 70, 1):

img[i][j]*=200

cv2.circle(img, (120,120), 20, (100,200,80), -1)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

canny = cv2.Canny(gray, 200, 300)

cv2.imshow('shjkgdh', canny)

gray = cv2.medianBlur(gray, 5)

circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 20,

param1=100,

param2=30,

minRadius=0,

maxRadius=0)

print circles

circles = np.uint16(np.around(circles))

for i in circles[0,:]:

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)

cv2.imshow('circles', img)

k = cv2.waitKey(0)

if k == 27:

cv2.destroyAllWindows()

解决方案

Your code is working just fine. The problem is in your HoughCircles threshold parameters.

Let's try to understand the parameters that you're using from OpenCV Docs:

param1 – First method-specific parameter. In case of CV_HOUGH_GRADIENT

, it is the higher threshold of the two passed to the Canny() edge

detector (the lower one is twice smaller).

param2 – Second method-specific parameter. In case of

CV_HOUGH_GRADIENT , it is the accumulator threshold for the circle

centers at the detection stage. The smaller it is, the more false

circles may be detected. Circles, corresponding to the larger

accumulator values, will be returned first.

So, as you can see, internally the HoughCircles function calls the Canny edge detector, this means that you can use a gray image in the function, instead of their contours.

Now reduce the param1 to 30 and param2 to 15 and see the results in the code that follows:

import cv2

import numpy as np

img = np.ones((200,250,3), dtype=np.uint8)

for i in range(50, 80, 1):

for j in range(40, 70, 1):

img[i][j]*=200

cv2.circle(img, (120,120), 20, (100,200,80), -1)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 20,

param1=30,

param2=15,

minRadius=0,

maxRadius=0)

print circles

circles = np.uint16(np.around(circles))

for i in circles[0,:]:

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)

cv2.imshow('circles', img)

k = cv2.waitKey(0)

if k == 27:

cv2.destroyAllWindows()

d7f7144b84ad3f44dcac272edcade32d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV进行轮廓检测、斑点检测检测可以使用以下代码: 首先,导入必要的库和读取图像: ```python import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 接下来,使用阈值处理将图像转换为二进制图像: ```python ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) ``` 接着,使用形态学操作去除噪点: ```python kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2) ``` 对于轮廓检测,可以使用`cv2.findContours()`函数: ```python contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) ``` 对于斑点检测检测,可以使用`cv2.HoughCircles()`函数: ```python circles = cv2.HoughCircles(opening,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) ``` 最后,可以将检测结果可视化: ```python cv2.drawContours(img, contours, -1, (0,0,255), 2) for i in circles[0,:]: cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 完整代码如下: ```python import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2) contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) circles = cv2.HoughCircles(opening,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) cv2.drawContours(img, contours, -1, (0,0,255), 2) for i in circles[0,:]: cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值