Компьютерное зрение с Ардуино

Удивительно, но оказывается есть проект обработки видео с помощью Arduino!
Для захвата видео используется шилд — Video Experimenter Shield и доработанная TVout library
Примеры работы:

— пример отслеживания объекта (Object Tracking)

код tv.capture() вызывается для захвата кадра. Затем, вычисляется рамка для яркого пятна на изображении. После вычисления расположения яркой области, квадрат и координаты окна выводятся в буфер кадра TVout. tv.resume() вызывается для отображения окна и координат на экране.

скетч:

#include <TVout.h>
#include <fontALL.h>
#define W 128
#define H 96

TVout tv;
unsigned char x,y;
unsigned char c;
unsigned char minX,minY,maxX,maxY;
char s[32];

void setup()  {
  tv.begin(NTSC, W, H);
  initOverlay();
  initInputProcessing();

  tv.select_font(font4x6);
  tv.fill(0);
}

void initOverlay() {
  TCCR1A = 0;
  // Enable timer1.  ICES0 is set to 0 for falling edge detection on input capture pin.
  TCCR1B = _BV(CS10);

  // Enable input capture interrupt
  TIMSK1 |= _BV(ICIE1);

  // Enable external interrupt INT0 on pin 2 with falling edge.
  EIMSK = _BV(INT0);
  EICRA = _BV(ISC11);
}

void initInputProcessing() {
  // Analog Comparator setup
  ADCSRA &= ~_BV(ADEN); // disable ADC
  ADCSRB |= _BV(ACME); // enable ADC multiplexer
  ADMUX &= ~_BV(MUX0);  // select A2 for use as AIN1 (negative voltage of comparator)
  ADMUX |= _BV(MUX1);
  ADMUX &= ~_BV(MUX2);
  ACSR &= ~_BV(ACIE);  // disable analog comparator interrupts
  ACSR &= ~_BV(ACIC);  // disable analog comparator input capture
}

// Required
ISR(INT0_vect) {
  display.scanLine = 0;
}

void loop() {
  tv.capture();

  // uncomment if tracking dark objects
  //tv.fill(INVERT);

  // compute bounding box
  minX = W;
  minY = H;
  maxX = 0;
  maxY = 0;
  boolean found = 0;
  for(int y=0;y<H;y++) {
    for(int x=0;x<W;x++) {
      c = tv.get_pixel(x,y);
      if (c == 1) {
        found = true;
        if (x < minX) {
          minX = x;
        }
        if (x > maxX) {
          maxX = x;
        }
        if (y < minY) {
          minY = y;
        }
        if (y > maxY) {
          maxY = y;
        }
      }
    }
  }

  // draw bounding box
  tv.fill(0);
  if (found) {
    tv.draw_line(minX, minY, maxX, minY, 1);
    tv.draw_line(minX, minY, minX, maxY, 1);
    tv.draw_line(maxX, minY, maxX, maxY, 1);
    tv.draw_line(minX, maxY, maxX, maxY, 1);
    sprintf(s, "%d, %d", ((maxX+minX)/2), ((maxY+minY)/2));
    tv.print(0, 0, s);
  }

  tv.resume();
  tv.delay_frame(2);
}



— простейщий детектор границ (Edge Detection)

UPD
комментарий автора о скорости обработки видео:
Скорость сканирования TVout составляет 60 кадров в секунду. Итак, когда вы захватываете изображение, сканирование/отрисовка останавливается на время обработки. Логика для вычисления ограничительной рамки, кажется, не занимает много времени, но потом код отображает результат на 2 кадра. Если вы строите робота или что-то подобное, вам не обязательно использовать выход, так что у вас не будет этой задержки в 2 кадра для отображения результата (или печати координат на экран, и т.п.). Практический результат, вы должны быть в состоянии отслеживать объекты на 20 кадров в секунду или лучше, но это только оценочно.


Ссылки:
Arduino Computer Vision
  • +2
  • 24 марта 2011, 22:05
  • noonv

Комментарии (7)

RSS свернуть / развернуть
+
+1
классно!
не думал что avr может обрабатывать видео в реальном времени
avatar

Romiks

  • 25 марта 2011, 14:11
+
0
Можно организовывать игры типа лазерного тира, или еще чего :)
avatar

Tickat

  • 25 марта 2011, 16:49
+
0
лучше управление жестами, хотя это уже по-моему нереально, слишком много операций, разве что разогнать мегу:)
avatar

Romiks

  • 25 марта 2011, 20:09
+
0
А вот мне больще интересно посему скетч смешаный, частично ардуино иде частично авр гсс. Енто для чиго написано?
avatar

mogalkov

  • 25 марта 2011, 21:20
+
0
кто нибудь знает где найти схему этого шилда?
владельци не поделитесь?
avatar

bigden82

  • 28 марта 2011, 21:56
+
+1
на авторской страничке всё есть

parts list
avatar

admin

  • 28 марта 2011, 22:54
+
0
спасибо нашел уже сам, сразу после как спросил у него там и схема и печатка выложены, уже протестил работает
avatar

bigden82

  • 29 марта 2011, 22:22

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.