Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于opencvpython的不完全圆检测_Python_Opencv_Geometry_Detection - Fatal编程技术网

基于opencvpython的不完全圆检测

基于opencvpython的不完全圆检测,python,opencv,geometry,detection,Python,Opencv,Geometry,Detection,有可能得到不完整圆的坐标吗?我正在使用opencv和python。所以我可以找到大部分的圆圈。 但是我不知道怎样才能发现照片中不完整的圆环。 我正在寻找一个简单的方法来解决它 导入系统 将cv2作为cv导入 将numpy作为np导入 ##[加载] 默认_文件='captcha2.png' #加载图像 src=cv.imread(cv.samples.findFile(默认文件),cv.imread\u颜色) ##[将颜色转换为灰色] #将其转换为灰色 灰色=cv.CVT颜色(src、cv.CO

有可能得到不完整圆的坐标吗?我正在使用opencv和python。所以我可以找到大部分的圆圈。 但是我不知道怎样才能发现照片中不完整的圆环。 我正在寻找一个简单的方法来解决它

导入系统 将cv2作为cv导入 将numpy作为np导入 ##[加载] 默认_文件='captcha2.png' #加载图像 src=cv.imread(cv.samples.findFile(默认文件),cv.imread\u颜色) ##[将颜色转换为灰色] #将其转换为灰色 灰色=cv.CVT颜色(src、cv.COLOR\u BGR2GRAY) ##[将颜色转换为灰色] ##[减少噪音] #减少噪声以避免假圆检测 灰色=等速中间模糊(灰色,3) ##[减少噪音] ##[霍格圈] #行=灰色。形状[0] 圆=cv.HOUGH圆(灰色,cv.HOUGH_渐变,1,5,, 参数1=1,参数2=35, 最小半径=1,最大半径=30) ##[霍格圈] ##[抽签] 如果圆不是无: 圆=np.uint16(np.around(圆)) 对于圆[0,:]中的i: 中心=(i[0],i[1]) #圆心 等速圆(src,中心,1,(0,100,100),3) #圆轮廓 半径=i[2] 等速圆(src,中心,半径,(255,0,255),3) ##[抽签] ##[显示] cv.imshow(“检测到的圆”,src) cv.waitKey(0) ##[显示] 嗨,还有一张照片。我想要不完整圆圈的x线和y线,左下角是浅蓝色

原图如下:


您需要删除图像的彩色背景,只显示圆形

一种方法是:

  • 获取输入图像的

  • 应用于检测圆


二进制掩码:

使用二进制掩码,我们将检测圆:

代码:


#加载库
进口cv2
将numpy作为np导入
#加载图像
img=cv2.imread(“r5lcN.png”)
#复制输入图像
out=img.copy()
#转换为HSV颜色空间
hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
#获取二进制掩码
msk=cv2.inRange(hsv,np.array([0,0130]),np.array([179,255,255]))
#检测图像中的圆
crc=cv2.HOUGH圆(msk,cv2.HOUGH_梯度,1,10,参数1=50,参数2=25,最小半径=0,最大半径=0)
#确保找到圆圈
如果crc不是无:
#将圆的坐标和半径转换为整数
crc=np.round(crc[0,:]).astype(“int”)
#对于每个(x,y)坐标和圆的半径
对于crc中的(x,y,r):
#画圆圈
圆(向外,(x,y),r,(0,255,0),4)
#打印坐标
打印(“x:{},y:{}”。格式(x,y))
#展示
cv2.imshow(“out”,np.hstack([img,out]))
cv2.等待键(0)
输出:

x:178, y:60
x:128, y:22
x:248, y:20
x:378, y:52
x:280, y:60
x:294, y:46
x:250, y:44
x:150, y:62
解释

我们有三个机会找到阈值:

  • 简单阈值结果:
  • 自适应阈值
  • 二元掩模
正如我们所看到的,第三种选择给了我们一个合适的结果。当然,您可以使用其他选项获得所需的结果,但可能需要很长时间才能找到合适的参数。然后应用Hough圆,对参数值进行处理,得到了理想的结果

更新

对于第二张上传的图像,可以通过减少Hough圆的第一个和第二个参数来检测半圆

crc=cv2.HOUGH圆(msk,cv2.HOUGH_梯度,1,10,param1=10,param2=15,minRadius=0,maxRadius=0)
替换主代码中的上述行将导致:

控制台结果

x:238, y:38
x:56, y:30
x:44, y:62
x:208, y:26

你也能附上电流输出吗?嘿,谢谢,这有助于我找到所有的圆圈。我在找你解释过的这样的东西。我喜欢二进制掩码的方式。但也可以在左下方找到开放圆?…找到开放圆。。。。你是说不完整的圆圈?我想是的,但不尝试就不确定哦,是的,我是说不完整的圆圈。这只是一个开放的圆圈。哪一个?我想我已经检测到了输入图像中的所有圆圈,我添加了另一张图片。还有一个不完整的圆圈。我在找x线和y线。