2017-01-24 4 views
0

Это продолжение моего previous question. Теперь у меня есть изображение, как этотOpenCV - Размеры измерительной коробки в Python

enter image description here

Здесь углы обнаружены. Теперь я пытаюсь оценить размеры более крупной коробки, пока известны меньшие размеры черного ящика.

Может ли кто-нибудь указать мне, что является лучшим способом оценить размеры коробки? Я могу сделать это с простым евклидовым расстоянием, но я не знаю, правильно это или нет. Или даже если это правильный путь, то из списка кортежей (координат), как я могу найти расстояния, такие как A-B или A-D или G-H, но не как A-C или A-F?

Последовательность должна быть сохранена, чтобы получить правильные размеры. Кроме того, у меня есть две коробки, поэтому, когда я создаю список углов координат, тогда он должен содержать все координаты от A-J, и я не знаю, какие координаты принадлежат к тому ящику. Итак, как я могу сохранить это для двух разных ящиков, потому что я хочу запустить этот код для получения более похожих изображений.

Примечание: Углы на этом изображении не являются ни одной точкой, а набором точек, поэтому я сгруппировал набор углов и усреднил их, чтобы получить одну (x, y) координату для каждого угла.

Я попытался изо всех сил объяснить мои вопросы. Будем очень рады получить ответы на любые вопросы :) Спасибо.

+0

Несколько вопросов к вам: Будут ли ваши «подобные» образы всегда показывают коробки в этом положении? (маленькая перед большим, с достаточным пространством между ними, чтобы вы могли их легко различить? Когда вы говорите, что хотите оценить размеры более крупной коробки, зная размеры меньшего, вы хотите учитывайте перспективу (т. е. размер коробки больше, как показано на рисунке) Почему вы считаете, что эвклидовое расстояние неверно? – Soltius

ответ

1

Для

Как я могу найти расстояние, как AB или AD или GH, но не так, как AC или AF

часть

Вот быстрый код, не эффективен для изображений с большим количеством углов, но для вашего дела все в порядке.Идея заключается в том, чтобы начать с дилатационной края изображения, которое вы получили в другой вопрос (только с большой коробкой, но идея та же для изображения, где есть также небольшая коробка) dilated edges

то для всех возможных сочетание углов, вы смотрите на несколько точек на воображаемой линии между ними, а затем вы проверяете, действительно ли эти точки попадают на настоящую строку на изображении.

import cv2 
import numpy as np 

#getting intermediate points on the line between point1 and point2 
#for example, calling this function with (p1,p2,3) will return the point 
#on the line between p1 and p2, at 1/3 distance from p2 
def get_intermediate_point(p1,p2,ratio): 
    return [p1[0]+(p2[0]-p1[0])/ratio,p1[1]+(p2[1]-p1[1])/ratio] 

#open dilated edge images 
img=cv2.imread(dilated_edges,0) 

#corners you got from your segmentation and other question 
corners=[[29,94],[102,21],[184,52],[183,547],[101,576],[27,509]] 
nb_corners=len(corners) 

#intermediate points between corners you are going to test 
ratios=[2,4,6,8] #in this example, the middle point, the quarter point, etc 
nb_ratios=len(ratios) 

#list which will contain all connected corners 
connected_corners=[] 

#double loop for going through all possible corners 
for i in range(nb_corners-1): 
    for j in range(i+1,nb_corners): 
     cpt=0 
     c1=corners[i]; c2=corners[j] 

     #testing every intermediate points between the selected corners 
     for ratio in ratios: 
      p=get_intermediate_point(c1,c2,ratio) 

      #checking if these points fall on a white pixel in the image 
      if img[p[0],p[1]]==255: 
       cpt+=1 

     #if enough of the intermediate points fall on a white pixel 
     if cpt>=int(nb_ratios*0.75): 
      #then we assume that the 2 corners are indeed connected by a line 
      connected_corners.append([i,j]) 

print(connected_corners) 
+0

Логика Оценка:) – muazfaiz

0

В общем, вы не можете, так как любая реконструкция только в масштабе.

В принципе, учитывая калиброванную камеру и 6 2D-точек (6x2 = 12), вы хотите найти 6 трехмерных точек + масштаб = 6x3 + 1 = 19. Недостаточно уравнений.

Для этого вам нужно будет сделать некоторые предположения и вставить их в уравнения.

Форма пример:

  1. Края коробки расположены перпендикулярно друг к другу (что означает, что каждые 2 соседние точки имеют, по меньшей мере, одно значение координаты).
  2. Вам нужно предположить, что вы знаете высоту нижних точек, то есть они находятся на той же плоскости, что и ваша калибровочная коробка (это даст вам Z видимых нижних точек).

Надеемся, этих ограничений достаточно, чтобы дать вам меньше уравнений, которые неизвестны, и вы можете решить набор линейных уравнений.

+0

Вы правы, я должен сделать некоторые предположения. Но я попытался найти углы между каждая из двух линий, но ни одна из них не ровно на 90 градусов. Также есть один угол, который формируется точкой в ​​маленькой коробке, а другой - большой коробкой, и это делает угол около 90. Любые предложения для этого? – muazfaiz

Смежные вопросы