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_Computer Vision - Fatal编程技术网

Opencv 找到最适合的图像

Opencv 找到最适合的图像,opencv,computer-vision,Opencv,Computer Vision,给定一批图像,我必须找到最适合的图像,如下面给出的示例,但我的解决方案不起作用: 左图 正确形象 我首先尝试使用google cloud Vision API,但效果不好,然后我用ludwig训练了一个模型,但要尝试所有可能的图像组合将需要很长时间,因为我有2500个左图像和2500个右图像 有没有办法找出这个问题或减少可能出现的情况,以便我可以在我的模型中使用它。此解决方案查看一对图像。该算法评估图像中的形状是否会像钥匙和锁一样啮合。我的回答并没有试图将图像对齐 第一步是在图像中找到轮廓:

给定一批图像,我必须找到最适合的图像,如下面给出的示例,但我的解决方案不起作用:

左图

正确形象

我首先尝试使用google cloud Vision API,但效果不好,然后我用ludwig训练了一个模型,但要尝试所有可能的图像组合将需要很长时间,因为我有2500个左图像和2500个右图像


有没有办法找出这个问题或减少可能出现的情况,以便我可以在我的模型中使用它。

此解决方案查看一对图像。该算法评估图像中的形状是否会像钥匙和锁一样啮合。我的回答并没有试图将图像对齐

第一步是在图像中找到轮廓:

left= cv2.imread('/home/stephen/Desktop/left.png')
right = cv2.imread('/home/stephen/Desktop/right.png')
# Resize
left = cv2.resize(left, (320,320))
gray = cv2.cvtColor(left, cv2.COLOR_BGR2GRAY)
_, left_contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# Approximate
left_contour = left_contours[0]
epsilon = 0.005*cv2.arcLength(left_contour,True)
left_contour = cv2.approxPolyDP(left_contour,epsilon,True)

什么是等高线?轮廓只是位于形状周长上的点列表。三角形的轮廓将有3个点,长度为3。点之间的距离将是三角形中每条腿的长度

类似地,峰谷之间的距离将在图像中匹配。为了计算这个距离,我找到了轮廓点之间的距离。由于图像对齐的方式,我只使用了水平距离

left_dx = []
for point in range(len(left_contour)-1):
    a = left_contour[point][0]
    b = left_contour[point+1][0]
    dist = a[0]-b[0]
    left_dx.append(dist)
right_dx = []
for point in range(len(right_contour)-1):
    a = right_contour[point][0]
    b = right_contour[point+1][0]
    # Use the - of the distance becuase this is the key hole, not the key
    dist = -distance(a,b)
    right_dx.append(dist)
# Reverse so they will fit
right_dx.reverse()

A在这一点上,你可以看到轮廓线。如果您有更好的图像,轮廓将在此步骤中对齐。我使用Scipy对其进行了重组,并检查了功能是否匹配。如果两个函数对齐,则图像中的对象将网格化

left_x_values = []
for i in range(len(left_dx)): left_x_values.append(i)
x = np.array(left_x_values)
y = np.array(left_dx)
left_x_new = np.linspace(x.min(), x.max(),500)
f = interp1d(x, y, kind='quadratic')
left_y_smooth=f(left_x_new)
plt.plot (left_x_new, left_y_smooth,c = 'g')

我在自己生成的一对图像上再次尝试了这一点:

轮廓:

轮廓点之间的距离:

拟合轮廓:


也许您可以适当地澄清这些限制?两半之间是否存在比例和旋转差异。“粘在外面的尖头”总是矩形的,并且正好有18个尖头,还是一些形状是曲线、椭圆或三角形?最佳拟合是否总是指填充的矩形/正方形?如果正方形/矩形仅通过重叠(或孔)实现,那么误差度量是多少?@MarkSetchell如图所示()。手指的数量固定为15,但也可以倾斜一个角度,它们的形状也固定为矩形或倾斜的形状,如图中所示。@Mika它们将与所有图像匹配注意:图像的尺寸不同是的,这似乎是一个很好的方法。你也可以添加一些代码,你用来执行这个,因为我不知道OpenCV是这样的。这似乎很有趣。我们怎样才能与别人竞争?他提到了2500个组合。