如何使用OpenCV检测车轮中的椭圆
我有一个车轮的图像,我想用OpenCV(用于车辆/车轮的姿势估计)检测映射到此车轮(或车轮内圈)的椭圆 [![在此处输入图像描述][1][1] 有人知道怎么做吗 [![在此处输入图像描述][2][2] 生成的图像应该是这样的(或者有点像这样-我需要检索经过ellispe的几个点)。请注意,结果应该是一个椭圆,而不是一个圆,因为如果从侧面看,车轮可能处于透视/扭曲状态 到目前为止,我尝试了轮廓(以及识别最大的轮廓区域)、canny和颜色阈值,我能够在大多数测试图像上识别车轮的内部椭圆(成功!)。这个“内椭圆”是最大轮廓的一部分,但是它也包含我不需要的其他点 如图所示: [![在此处输入图像描述][3][3] 最后一个问题是,如何导出这个内圈/椭圆的几个点(并去除其他垃圾),以便计算椭圆参数 任何帮助都将不胜感激 非常感谢 编辑: 以下是我目前的代码:如何使用OpenCV检测车轮中的椭圆,opencv,Opencv,我有一个车轮的图像,我想用OpenCV(用于车辆/车轮的姿势估计)检测映射到此车轮(或车轮内圈)的椭圆 [![在此处输入图像描述][1][1] 有人知道怎么做吗 [![在此处输入图像描述][2][2] 生成的图像应该是这样的(或者有点像这样-我需要检索经过ellispe的几个点)。请注意,结果应该是一个椭圆,而不是一个圆,因为如果从侧面看,车轮可能处于透视/扭曲状态 到目前为止,我尝试了轮廓(以及识别最大的轮廓区域)、canny和颜色阈值,我能够在大多数测试图像上识别车轮的内部椭圆(成功!)。这
导入系统
将numpy作为np导入
导入skimage.io
导入撇渣过滤器
将matplotlib.pyplot作为plt导入
进口cv2
从skimage导入数据、颜色、img_作为ubyte
从skimage.feature导入canny
从skimage.transform导入hough_椭圆
从skimage.draw导入椭圆\u周长
#从命令行获取文件名和sigma值
filename0='back\u wheel.png'
filename1=“backwheel1.png”
filename2=“backwheel2.png”
filename3=“backwheel3.png”
filename4=“frontwheel1.png”
filename5=“frontwheel2.png”
def getWheel0(文件名):
image\u rgb\u orig=cv2.imread(文件名)
image\u rgb=image\u rgb\u orig.copy()
打印('原始尺寸:',图像形状)
宽度=350
高度=(int)(宽度*图像形状[0]/图像形状[1])
尺寸=(宽度、高度)
图像_rgb=cv2.调整大小(图像_rgb,尺寸,插值=cv2.内部区域)
image\u gray=cv2.cvt颜色(image\u rgb,cv2.COLOR\u BGR2GRAY)
equ=cv2.均衡历史(图像为灰色)
#边缘=cv2.Canny(图像为灰色,150200)
norm_image=cv2.normalize(eq,None,alpha=0,beta=1,norm_type=cv2.norm_MINMAX)
#---首先使用灰度图像获取阈值---
ret,th=cv2.阈值(norm_图像,50,100,cv2.从阈值到零阈值)
#---找到二值图像中的所有轮廓---
等高线,层次=cv2.findContours(th,2,1)
#轮廓,层次=cv2.查找轮廓(th,cv2.RETR\u外部,cv2.链\u近似值\u TC89\u L1)
cnt=等高线
大轮廓=[]
最大值=0
对于cnt中的i:
面积=cv2。轮廓面积(i)#——找到面积最大的轮廓---
如果(面积>最大值):
最大值=面积
大_等高线=i
结果=cv2。绘制轮廓(图像rgb,大轮廓,-1,(0255,0),3)
图2,(ax1,ax2,ax3)=plt.子批次(ncols=3,nrows=1,figsize=(8,4),sharex=True,
shary=True)
ax1.设置标题(“原始图片”)
ax1.imshow(图像\u rgb\u原始)
ax2.设置标题(“阈值”)
ax2.imshow(th)
ax3.设置标题(“轮廓”)
ax3.imshow(结果)
plt.show()
getWheel0(文件名0)
getWheel0(文件名1)
getWheel0(文件名2)
getWheel0(文件名3)
getWheel0(文件名4)
getWheel0(文件名5)
使用
“python tire.py”在图像上定位圆的问题是众所周知的,并且已经解决了 使用霍夫圆变换。 这是OpenCV库的一个基本功能: 广义Hough变换可以用来检测椭圆。但是,您需要自己编写代码,因为答案中提供了一些合理的想法。您需要具有更多尺寸(5)的累加器,以防检测到直线(2)或圆(3),但这不应该是问题 看起来canny在你的图像上也有很好的边缘。您可以尝试以下操作:
这两种解决方案可能不适用于轴不对称的椭圆和类椭圆轮廓。在图像上定位圆的问题是众所周知的,并且已经解决了 使用霍夫圆变换。 这是OpenCV库的一个基本功能: 广义Hough变换可以用来检测椭圆。但是,您需要自己编写代码,因为答案中提供了一些合理的想法。您需要具有更多尺寸(5)的累加器,以防检测到直线(2)或圆(3),但这不应该是问题 看起来canny在你的图像上也有很好的边缘。您可以尝试以下操作:
这两种解决方案可能不适用于轴不对称的椭圆和类似椭圆的轮廓。谢谢大家的帖子。这些非常有助于接近答案。我最后做了以下几点: 灰度 规范化 findContours 然后在轮廓上,我做cornerHarris,它返回一个图像大小的垫子,每个像素的轮廓都有一个角值 我将数据正常化