2015-06-04 2 views
0

Я пытаюсь написать код обнаружения изображения для машины выбора и размещения. Я новичок в OpenCV и много примеров встречаю, но все еще имею два нерешенных вопроса. Первый из них, я думаю, у меня есть решение, но я потерял второе.Обнаружение объектов OpenCV/EMGU (C#)

Я пытаюсь определить смещение и угол нижней части детали. По сути, насколько далеко находится объект от креста (только индикатор центра кадра) и какой угол поворота имеет часть центра центра. Я использовал фильтры для отображения прокладок компонентов.

bottom pads of surface mount part

Я уверен, что я хочу, чтобы осуществить что-то вроде этого http://felix.abecassis.me/2011/10/opencv-bounding-box-skew-angle/ - но я не знаю, как перевести код на C# (http://www.emgu.com/wiki/index.php/Main_Page). Любые указатели были бы полезны.

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

0402 resistor and needle

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

ответ

0

Сначала вы должны обнаружить каждый объект с помощью findContours. Затем вы можете использовать minimum area rectangle function на каждом найденном контуре. Я предполагаю, что вы знаете размер и координаты своего креста, чтобы вы могли использовать координаты центра MCvBox2D, чтобы получить смещение. Кроме того, вы можете прочитать свойство угла окна, чтобы оно соответствовало вашей цели.

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

Возможно, вам тоже может помочь Detection of Quadrilaterlas в библиотеке AForge.

Edit: Чтобы объединить свои контуры я хотел бы попробовать что-то вроде этого:

Rectangle merged = New Rectangle(New Point(img.Width, img.Height), New Size(0, 0)); //img is your binarized image 
Contour<Point> Pad_contours= img.FindContours(CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,CvEnum.RETR_TYPE.CV_RETR_LIST); 
    while(Pad_contours !=null) 
    { 

    if(Pad_contours.Area <Pad_Area_max &&Pad_contours>Pad_Area_min)//Filter Pads to avoid false positive Contours 
    { 
    //Merge Pad contours into a single rectangle 
     if(merged.Height >0) 
     merged.Bottom=Math.Max(merged.Bottom,Pad_Contours.BoundingRectangle.Bottom); 
     else 
     merged.Height = contours.BoundingRectangle.Height; 

     merged.Top=Math.Min(merged.Top,Pad_Contours.BoundingRectangle.Top); 
     merged.Left=math.Min(merged.Left,Pad_Contours.BoundingRectangle.Left); 

     if(merged.Width>0) 
     merged.Right=Max(merged.Right,pad_Contours.BoundingRectangle.Right); 
     else 
     merged.Width=Pad_Contours.BoundingRectangle.Width; 
    } 
    //get next Pad 
     If(Pad_contours.VNext==null) 
     Pad_contours=Pad_contours.HNext; 
     else 
     Pad_contours = Pad_contours.VNext; 
    } 

Прямоугольник «слиты» должны приложить все свои колодки прямо сейчас. Проблема в том, что вы не получите такой угол, потому что прямоугольник всегда вертикально 90 °. Чтобы решить эту проблему, я буду проходить через контуры, как показано выше, и хранить каждую точку каждого контура в дополнительном контенте данных. Затем я использовал бы функцию минимального прямоугольника прямоугольника, упомянутую выше, и применил бы ее на всех собранных точках. Это должно дать вам ограниченный прямоугольник с свойством угла.

+0

Я пытался найти способ объединить контуры для части А, затем применить прямоугольник поиска - это всего лишь одна часть, и все, что вы видите, это медные подкладки под ним (http://i.imgur.com /cUynGrU.png). – reza

+0

Я отредактировал свой ответ и надеюсь, что это поможет вам. –

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