Удивительно, но оказывается есть проект обработки видео с помощью 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;ymaxX) { 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
0 комментариев на «“Компьютерное зрение с Ардуино”»
классно!
не думал что avr может обрабатывать видео в реальном времени
Можно организовывать игры типа лазерного тира, или еще чего 🙂
лучше управление жестами, хотя это уже по-моему нереально, слишком много операций, разве что разогнать мегу:)
А вот мне больще интересно посему скетч смешаный, частично ардуино иде частично авр гсс. Енто для чиго написано?
кто нибудь знает где найти схему этого шилда?
владельци не поделитесь?
на авторской страничке всё есть
parts list
спасибо нашел уже сам, сразу после как спросил у него там и схема и печатка выложены, уже протестил работает