2016-01-17 7 views
1

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

Станок представляет собой автоматический принтер для струйной печати, используемый в электронной промышленности. Точная цель машины заключается в том, чтобы печатать паяльную пасту на голых печатных платах. Система включает в себя 2 камеры, которые образуют систему видения, используемую для определения координат и автоматизации процесса, в котором задействовано оборудование. Проблема заключается в том, что мне нужно иметь возможность находить фигуры и объекты в изображениях, снятых с камер, который достаточно прямолинейный, но - для того, чтобы получить требуемую точность, я должен быть в состоянии сделать это с точностью субпикселей.

Две камеры образуют одну камеру двойного зрения, одна камера будет смотреть на трафарет, а другая смотрит на печатную плату. Камера двойного зрения находится на движущейся каретке, которая перемещается в X и Y. PCB зажимается на столе, чем может перемещаться по X, Y и тете. Система видения используется для определения разницы между позицией печатной платы и положением трафарета, и затем таблица корректируется для выравнивания двух.

РЕДАКТИРОВАТЬ:

Это частичный снимок экрана а, взятым из существующей программы пользовательского интерфейса:

This

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

ПРИМЕЧАНИЕ: Как вы читаете это, вы, вероятно, думаете: «Хорошо, почему бы вам просто не использовать все, что вы используете в существующем пользовательском интерфейсе?» Существующий пользовательский интерфейс написан на VB6, что-то, о чем я хочу отойти, а сторона видения программы - .ocx, написанная сторонней компанией, которая больше не существует.

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

EDIT:

Вот пример изображения взяты из тестовой программы, которую я написал, используя AForge:

Here

Красный контур и перекрестие, что я добавил в визуальная помощь/эксперимент. Это было сделано с камерой, которую я, скорее всего, буду использовать, которая имеет разрешение 1280 x 1024, однако объектив не является фактическим объективом, который я буду использовать, поэтому изображение слегка «fisheyed». Кроме того, объекты, представляющие интерес, будут лучше света, чем это.

В реальной системе объектив будет смотреть на квадрат размером 10 мм x 8 мм как на трафарете, так и на печатной плате, то есть каждый пиксель будет отображать 7.8125um^2, однако я могу перемещать таблицу XYY с шагом в 1,25um за раз, что бесполезно, если я не могу видеть эти движения с камерой. Мне нужна точность 1um (sub).

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

Или, еще лучше, кто-нибудь знает, как я мог написать что-то, чтобы сделать это сам? Я даже не знаю, с чего начать!

Любая обратная связь будет принята с благодарностью.

+0

Планируете ли вы это сделать, объединив два изображения камеры или [подспиксельные вычисления] (http://homepages.inf.ed.ac.uk/rbf/PAPERS/spedraft.pdf)? Я думаю, что последнее требует некоторых знаний о содержании изображения. – TaW

+0

Подпиксельный расчет (спасибо за ссылку, кстати, проливает некоторый свет!) Я отредактировал свой вопрос, чтобы предоставить дополнительную информацию, надеюсь, что это поможет. –

+0

добавьте образцы входных изображений, а также добавьте больше информации, например разрешение, масштаб пикселей и желаемую точность, размер шага перемещения и т. Д., Требуемую субпиксельную точность того, что именно (в отношении вашей геометрии вашего компьютера)? Кроме того, если у вас есть унифицированные условия освещения/цвета, вы можете использовать цвет и интенсивность для каждого типа печатной платы, чтобы вывести субпиксельное положение линии/края из двух соседних пикселей в обеих осях x, y – Spektre

ответ

0

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

  1. линеаризует геометрию изображения

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

  2. условия нормализуют освещения

  3. Точность субпиксель

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

    sub-pixel aligned

    Каждый квадрат сетки представляет собой область пикселя. c0 - серый и c1 - зеленый цвет. В изображении камеры вы получили окончательный цвет как сочетание всех цветов внутри каждого пикселя:

    • c = s0*c0 + s1*c1

    где c окончательный цвет пикселя и s0,s1 имеют площадь coresponding для c0,c1 цветов в диапазоне <0,1> где s0+s1=1.0. Теперь мы хотим вычислить s0,s1 для получения субпиксельной точности. Поэтому сначала определить положение пикселя на границе в качестве одного из них:

    • горизонтальный край
    • вертикальное ребро
    • угол

    это может быть сделано путем проверки соседних пикселей. c0,c1 можно получить из пикселей с насыщенным цветом (все соседи имеют одинаковый цвет). Они находятся внутри пикселов.Я бы проигнорировал угловые пиксели, поскольку их положение может быть получено из ближайших кратковременных пикселей H/V (невозможно получить координаты x, y из приведенного выше уравнения). Таким образом, в настоящее время для каждого H, V край просто решить систему:

    I. c = s0*c0 + s1*c1 
    II. s0 + s1 = 1.0; 
    

    вычислить s0,s1 и положение края для вертикальных кромок является одним из них:

    x=x0 + pixel_size*s0 // if c0 is on the left 
    x=x0 + pixel_size*s1 // if c1 is on the left 
    

    горизонтальные ребра, как это:

    y=y0 + pixel_size*s0 // if c0 is on the top 
    y=y0 + pixel_size*s1 // if c1 is on the bottom 
    

    где x0,y0 - пиксель в верхнем левом положении в пикселях, а координата x+ идет вправо, а y+ - спускаться. Если у вас есть другая настройка, просто измените уравнения ...

    Теперь, если вы получили ориентированные по осевой линии края, вам нужно вычислить наклон (сколько пикселей требуется в одной оси для изменения в другом dy/dx. областей соответственно:.

    sub-pixel non aligned

    Так что единственное, что изменения является переход от вычисленной s0,s1 до фактического положения кромки теперь нужно вычислить левую/правую сторону или вверх/вниз, если вы используете уравнение с. пример с выравниванием по оси, тогда вы получите положение края в середине пикселя. Таким образом, вы просто сдвигаете его по склону с обеих сторон на x +/- 0.5*dx/dy или y +/- 0.5*dy/dx, где dx,dy - это наклон края.

    slope

    Чтобы получить dx,dy только поиск по краю для полностью насыщенных пикселей, и если найден, то (dx,dy) расстояние между 2 ближайших таких пикселей ...

[Примечания]

вы можете сделать это на шкале серого и RGB. Надеюсь это немного поможет.

+0

Большое спасибо @Spektre, это мне очень помогает! Именно такую ​​информацию я искал! –

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

  • Нет связанных вопросов^_^