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
如何使用OpenCV检测车轮中的椭圆_Opencv - Fatal编程技术网

如何使用OpenCV检测车轮中的椭圆

如何使用OpenCV检测车轮中的椭圆,opencv,Opencv,我有一个车轮的图像,我想用OpenCV(用于车辆/车轮的姿势估计)检测映射到此车轮(或车轮内圈)的椭圆 [![在此处输入图像描述][1][1] 有人知道怎么做吗 [![在此处输入图像描述][2][2] 生成的图像应该是这样的(或者有点像这样-我需要检索经过ellispe的几个点)。请注意,结果应该是一个椭圆,而不是一个圆,因为如果从侧面看,车轮可能处于透视/扭曲状态 到目前为止,我尝试了轮廓(以及识别最大的轮廓区域)、canny和颜色阈值,我能够在大多数测试图像上识别车轮的内部椭圆(成功!)。这

我有一个车轮的图像,我想用OpenCV(用于车辆/车轮的姿势估计)检测映射到此车轮(或车轮内圈)的椭圆

[![在此处输入图像描述][1][1]

有人知道怎么做吗

[![在此处输入图像描述][2][2]

生成的图像应该是这样的(或者有点像这样-我需要检索经过ellispe的几个点)。请注意,结果应该是一个椭圆,而不是一个圆,因为如果从侧面看,车轮可能处于透视/扭曲状态

到目前为止,我尝试了轮廓(以及识别最大的轮廓区域)、canny和颜色阈值,我能够在大多数测试图像上识别车轮的内部椭圆(成功!)。这个“内椭圆”是最大轮廓的一部分,但是它也包含我不需要的其他点

如图所示: [![在此处输入图像描述][3][3]

最后一个问题是,如何导出这个内圈/椭圆的几个点(并去除其他垃圾),以便计算椭圆参数

任何帮助都将不胜感激

非常感谢

编辑:

以下是我目前的代码:


导入系统
将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,它返回一个图像大小的垫子,每个像素的轮廓都有一个角值

    我将数据正常化