Детектування об'єктів opencv. OpenCV. Інструмент для прозріння машини. Зіставлення із шаблоном

Бібліотека комп'ютерного зору та машинного навчання з відкритим кодом. До неї входять понад 2500 алгоритмів, у яких є як класичні, і сучасні алгоритми для комп'ютерного зору машинного навчання. Ця бібліотека має інтерфейси різними мовами, серед яких є Python (у цій статті використовуємо його), Java, C++ та Matlab.

Встановлення

Інструкцію зі встановлення на Windows можна подивитися, а на Linux -.

Імпорт та перегляд зображення

import cv2 image = cv2.imread("./шлях/до/зображення.розширення") cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows()

Примітка При читанні способом вище зображення знаходиться в колірному просторі не RGB (як усі звикли), а BGR. Можливо, спочатку це не так важливо, але як тільки ви почнете працювати з кольором - варто знати про цю особливість. Є 2 шляхи вирішення:

  1. Поміняти місцями 1-й канал (R – червоний) з 3-м каналом (B – синій), і тоді червоний колір буде (0,0,255), а не (255,0,0).
  2. Змінити колірний простір на RGB: rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    І тоді в коді працювати вже не з image, а з rgb_image.

Примітка Щоб закрити вікно, в якому відображається зображення, натисніть будь-яку клавішу. Якщо використовувати кнопку закриття вікна, можна натрапити на підвисання.

Протягом статті для відображення зображень буде використовуватися наступний код:

Import cv2 def viewImage(image, name_of_window): cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL) cv2.imshow(name_of_window, image) cv2.waitKey(0) cv2.destroyAllWindows()

Кадрування

Пісик після кадрування

Import cv2 cropped = image viewImage(cropped, "Пісик після кадрування")

Де image - це image.

Зміна розміру

Після зміни розміру на 20%

Import cv2 scale_percent = 20 # Відсоток від початкового розміру width = int(img.shape * scale_percent / 100) height = int(img.shape * scale_percent / 100) dim = (width, height) resized = cv2.resize(im , interpolation = cv2.INTER_AREA) viewImage(resized, "Після зміни розміру на 20%")

Ця функція враховує співвідношення сторін оригінального зображення. Інші функції зміни розміру зображень можна побачити.

Поворот

Пісик після повороту на 180 градусів

Import cv2 (h, w, d) = image.shape center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, 180, 1.0) rotated = cv2.warpAffine(image, M, (w , h)) viewImage(rotated, "Пісик після повороту на 180 градусів")

image.shape повертає висоту, ширину та канали. M – матриця повороту – повертає зображення на 180 градусів навколо центру. -ve - це кут повороту зображення за годинниковою стрілкою, а +ve відповідно проти годинникової.

Переклад у градації сірого та у чорно-біле зображення на порозі

Песик у градаціях сірого

Чорно-білий песик

Import cv2 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, threshold_image = cv2.threshold(im, 127, 255, 0) viewImage(gray_image, "Песик в градаціях сірого") ")

gray_image – це одноканальна версія зображення.

Функція threshold повертає зображення, в якому всі пікселі, які темніші (менше) 127 замінені на 0, а всі, які яскравіші (більше) 127, - на 255.

Для ясності інший приклад:

Ret, threshold = cv2.threshold (im, 150, 200, 10)

Тут все, що темніше, ніж 150, замінюється на 10, а все, що яскравіше – на 200.

Інші threshold-функції описані .

Розмиття/згладжування

Розмитий песик

Import cv2 blurred = cv2.GaussianBlur(image, (51, 51), 0) viewImage(blurred, "Розмитий песик")

Функція GaussianBlur (розмиття по Гаусс) приймає 3 параметри:

  1. Початкове зображення.
  2. Кортеж із двох позитивних непарних чисел. Чим більше числа, тим більша сила згладжування.
  3. sigmaXі sigmaY. Якщо ці параметри залишити рівними 0, їх значення буде розраховано автоматично.

Малювання прямокутників

Обводимо прямокутником мордочку песика

Import cv2 output = image.copy() cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10) viewImage(output, "Обводимо прямокутником обличчя песика")

Ця функція приймає 5 параметрів:

  1. Саме зображення.
  2. Координата верхнього лівого кута (x1, y1).
  3. Координата нижнього правого кута (x2, y2).
  4. Колір прямокутника (GBR/RGB залежно від вибраної моделі кольорів).
  5. Товщина прямокутника лінії.

Малювання ліній

2 песика, розділені лінією

Import cv2 output = image.copy() cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5) viewImage(output, "2 песика, розділені лінією")

Функція line приймає 5 параметрів:

  1. Саме зображення, у якому малюється лінія.
  2. Координата першої точки (x1, y1).
  3. Координата другої точки (x2, y2).
  4. Колір лінії (GBR/RGB залежно від вибраної моделі кольорів).
  5. Товщина лінії.

Текст на зображенні

Зображення з текстом

Import cv2 output = image.copy() cv2.putText(output, "We<3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "Изображение с текстом")

Функція putText приймає 7 параметрів:

  1. Безпосередньо зображення.
  2. Текст для зображення.
  3. Координата нижнього лівого кута початку тексту (x, y).
  4. Облич виявлено: 2

    Import cv2 image_path = "./шлях/к/фото.розширення" face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COL .detectMultiScale(gray, scaleFactor= 1.1, minNeighbors= 5, minSize=(10, 10)) faces_detected = "Облич виявлено: " + format(len(faces)) print(faces_detected) # Малюємо квадрати навколо осіб for (x, y , w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2) viewImage(image,faces_detected)

    detectMultiScale – загальна функція для розпізнавання як осіб, так і об'єктів. Щоб функція шукала саме обличчя, ми передаємо відповідний каскад.

    Функція detectMultiScale приймає 4 параметри:

    1. Оброблюване зображення в сірому градації.
    2. Параметр scaleFactor. Деякі особи можуть бути більшими за інших, оскільки знаходяться ближче, ніж інші. Цей параметр компенсує перспективу.
    3. Алгоритм розпізнавання використовує ковзне вікно під час розпізнавання об'єктів. Параметр minNeighbors визначає кількість об'єктів навколо обличчя. Тобто чим більше значення цього параметра, тим більше аналогічних об'єктів необхідно алгоритму, щоб визначив поточний об'єкт, як особа. Занадто маленьке значення збільшить кількість хибних спрацьовувань, а надто велике зробить алгоритм більш вимогливим.
    4. minSize – безпосередньо розмір цих областей.

    Contours - розпізнавання об'єктів

    Розпізнавання об'єктів здійснюється за допомогою колірної сегментації зображення. Для цього є дві функції: cv2.findContours та cv2.drawContours .

    У цій статті детально описано виявлення об'єктів за допомогою сегментації кольорів. Все, що вам потрібне для неї, знаходиться там.

    Збереження зображення

    import cv2 image = cv2.imread("./імпорт/шлях.розширення") cv2.imwrite("./експорт/шлях.розширення", image)

    Висновок

    OpenCV - відмінна бібліотека з легкими алгоритмами, які можуть використовуватися в 3D-рендері, просунутому редагуванні зображень і відео, відстеження та ідентифікації об'єктів і людей на відео, пошуку ідентичних зображень з набору та для багато чого ще.

    Ця бібліотека є дуже важливою для тих, хто розробляє проекти, пов'язані з машинним навчанням в області зображень.

Ну, в основному, вам потрібно виявити кола. Ви бачили cvHoughCircles() ? Чи дозволено це використовувати?

На цій сторінці є хороша інформація про те, як виявити речі за допомогою OpenCV. Вас може зацікавити розділ 2.5.

Це невелика демонстрація, яку я щойно написав, щоб знайти монети на цій картинці. Сподіваюся, ви можете використовувати частину коду у своїх інтересах.

Вхід :

Виходи :

// compiled with: g++ circles.cpp -o circles `pkg-config --cflags --libs opencv` #include #include #include #include int main(int argc, char** argv) ( IplImage* img = NULL; if ((img = cvLoadImage(argv))== 0) ( printf("cvLoadImage failed\n"); ) IplImage* gray = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1), CvMemStorage* storage = cvCreateMemStorage(0); , CV_GAUSSIAN, 7, 7), IplImage* canny = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U,1); 3);CvSeq* circles = cvHoughCircles(gray, storage;< circles->total; i++) (// float float int float* p = (float*)cvGetSeqElem( circles, i); cv::Point center(cvRound(p), cvRound(p)); int radius = cvRound(p) // draw the circle center cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0); // draw the circle outline cvCircle(rgbcanny, center, radius+1, CV_RGB(0, 0,255), 2, 8, 0); cvShowImage("cyrcles", rgbcanny); cvSaveImage("out.png", rgbcanny); cvWaitKey(0); return 0; )

Виявлення кіл сильно залежить від параметрів cvHoughCircles() . Зверніть увагу, що у цій демонстрації я також використав Canny.

Я повинен закодувати детектор об'єкта (в даному випадку кульку) за допомогою OpenCV. Проблема в тому, що кожен пошук у Google повертає мені щось з FACE DETECTION. Тому мені потрібна допомога в тому, з чого почати, що використовувати і т.д.

Певна інформація:

  • М'яч не має фіксованого кольору, він, ймовірно, буде білим, але може змінитися.
  • Я повинен використовувати машинне навчання, не обов'язково бути складним і надійним, пропозиція KNN (це простіше та простіше).
  • Після всього мого пошуку я виявив, що обчислення гістограми зразків тільки для куль і навчання його ML може бути корисним, але моя головна турбота тут у тому, що розмір кулі може і зміниться (ближче і далі від камери) і я не маю поняття, що передати ML, щоб класифікувати для мене, я маю на увазі.. я не можу (або я можу?) просто перевірити кожен піксель зображення для кожного можливого розміру (від, скажімо, від 5x5 до WxH) та сподіваємося знайти позитивний результат.
  • Там може бути нерівномірне тло, наприклад, люди, тканина за м'ячем тощо.
  • Як я вже сказав, я повинен використовувати алгоритм ML, що означає відсутність алгоритмів Хаара або Віоли.
  • Крім того, я думав про використання контурів, щоб знайти кола на зображенні Canny"ed, просто потрібно знайти спосіб перетворення контуру в рядок даних для навчання KNN.

    Отже... речення?

    Заздалегідь дякую. ;)

З цієї статті ви дізнаєтесь, як створити Python-скрипт для підрахунку кількості книг на зображенні за допомогою OpenCV.

Що ми будемо робити?

Погляньмо на зображення, на якому шукатимемо книги:

Ми бачимо, що на зображенні знаходяться чотири книги, а також речі, що відволікають, такі як кухоль кави, чашка Starbucks, кілька магнітів і цукерка.

Наша мета полягає в тому, щоб знайти чотири книги на зображенні, при цьому не визначивши жодного іншого предмета як книгу.

Які бібліотеки нам знадобляться?

Щоб написати систему для пошуку та виявлення книг на зображеннях, ми будемо використовувати OpenCV для роботи з комп'ютерним зором та обробки зображень. Нам також потрібно встановити NumPy для коректної роботи OpenCV. Переконайтеся, що у вас є ці бібліотеки!

Пошук книг на зображеннях за допомогою Python та OpenCV

Прим. перев. Ви можете помітити, що вихідний код нашої статті відрізняється від коду в оригіналі. Автор, ймовірно, використав встановлення необхідних бібліотек через репозиторії. Ми пропонуємо використовувати pip, що набагато простіше. Щоб уникнути появи помилок, рекомендуємо використовувати версію коду, наведену в нашій статті.

Відкрийте свій улюблений редактор коду, створіть новий файл з ім'ям find_books.py та почнемо:

# -*- coding: utf-8 -*- # імпортуйте необхідні пакети import numpy as np import cv2 # завантажте зображення, змініть колір на відтінки сірого та зменшіть різкість image = cv2.imread("example.jpg") gray = cv2. cvtColor(image, cv2.COLOR_BGR2GRAY) = cv2.GaussianBlur(gray, (3, 3), 0) cv2.imwrite("gray.jpg", gray)

Почнемо з імпорту бібліотеки OpenCV. Завантаження зображення з диска обробляється функцією cv2.imread. Тут ми просто завантажуємо його з диска, а потім перетворимо колірну гаму з RGB на відтінки сірого.

Ми також трохи розмиваємо зображення, щоб зменшити високочастотні шуми та підвищити точність нашої програми. Після виконання коду зображення має виглядати так:

Ми завантажили зображення з диска, перетворили його на відтінки сірого і трохи розмили.

Тепер давайте визначимо краї (тобто контури) об'єктів на зображенні:

# розпізнавання контурів edged = cv2.Canny(gray, 10, 250) cv2.imwrite("edged.jpg", edged)

Тепер наше зображення виглядає так:

Ми знайшли контури об'єктів зображення. Однак, як ви бачите, деякі контури не закриті - між контурами існують проміжки. Щоб усунути проміжки між білими пікселями зображення, ми застосуємо операцію «закриття»:

# створіть і застосуйте закриття kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel) cv2.imwrite("closed.jpg", clo

Тепер прогалини в контурах закриті:

Наступним кроком є ​​фактичне виявлення контурів об'єктів зображення. Для цього ми будемо використовувати функцію cv2.findContours:

# знайдіть контури у зображенні та підрахуйте кількість книг cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) total = 0

Розглянемо геометрію книжки.

Книга є прямокутником. У прямокутника чотири вершини. Тому, якщо ми розглянемо контур і виявимо, що він має чотири вершини, ми можемо припустити, що це книга, а чи не інший предмет на зображенні.

Щоб перевірити, чи є контур книгою чи ні, нам потрібно виконати цикл за кожним контуром:

# цикл по контурах for c in cnts: # апроксимуємо (згладжуємо) контур peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) # якщо у контуру 4 вершини, припускаємо, що це книга if len(approx) == 4: cv2.drawContours(image, , -1, (0, 255, 0), 4) total += 1

Для кожного контуру ми обчислюємо периметр, використовуючи cv2.arcLength , а потім апроксимуємо (згладжуємо) контур, використовуючи cv2.approxPolyDP .

Причина, через яку ми апроксимуємо контур, полягає в тому, що він може не бути ідеальним прямокутником. Через зашумлення і тіні на фото ймовірність того, що книга буде рівно 4 вершини, невелика. Апроксимуючи контур, ми вирішуємо цю проблему.

Нарешті, ми перевіряємо, що у апроксимованого контуру справді чотири вершини. Якщо це так, ми малюємо контур навколо книги, а потім збільшуємо лічильник загальної кількості книг.

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

# показуємо результуюче зображення print("Я знайшов (0) книг на цій картинці".format(total) cv2.imwrite("output.jpg", image))

На даному етапі наше зображення виглядатиме так:

Підведемо підсумки

У цій статті ви навчилися знаходити книги на зображеннях, використовуючи прості методи обробки зображень та комп'ютерного зору за допомогою Python та OpenCV.

Наш підхід полягав у тому, щоб:

  1. Завантажити зображення з диска та перетворити його на відтінки сірого.
  2. Трохи розмити зображення.
  3. Застосувати детектор контурів Canny для виявлення об'єктів зображення.
  4. Закрити будь-які проміжки у контурах.
  5. Знайти контури об'єктів на зображенні.
  6. Застосувати контурну апроксимацію, щоб визначити, чи був контур прямокутником і, отже, книгою.

Ви можете завантажити вихідний код скрипта та зображення, яке використовується у цій статті.

Під час вирішення завдань комп'ютерного зору не обійтися без використання спеціалізованого софту. Хочу познайомити вас з таким – OpenCV – бібліотека з відкритим вихідним кодом на C++. Має набір інструментів для оцифрування зображень, подальшої обробки через чисельні алгоритми або нейромережу.

Базові алгоритми обробки зображень: інтерпретації зображень, калібрування камери за зразком, усунення оптичних спотворень, визначення подібності, аналіз переміщення об'єкта, визначення форми об'єкта та стеження за об'єктом, 3D-реконструкція, сегментація об'єкта, розпізнавання жестів.

Завантажити бібліотеку можна на офіційному сайті http://sourceforge.net/projects/opencvlibrary/

Структура бібліотеки OpenCV

cxcore - ядро
* містить базові структури даних та алгоритми:
- базові операції над багатовимірними числовими масивами
- матрична алгебра, математичні ф-ції, генератори випадкових чисел
- Запис/відновлення структур даних у/з XML
- базові функції 2D графіки

CV - модуль обробки зображень та комп'ютерного зору
- базові операції над зображеннями (фільтрація, геометричні перетворення, перетворення колірних просторів тощо)
- аналіз зображень (вибір відмітних ознак, морфологія, пошук контурів, гістограми)
- аналіз руху, стеження за об'єктами
- Виявлення об'єктів, зокрема осіб
- калібрування камер, елементи відновлення просторової структури

Highgui - модуль для введення/виведення зображень і відео, створення інтерфейсу користувача
- захоплення відео з камер та відео файлів, читання/запис статичних зображень.
- функції для організації простого UI (всі демо-додатки використовують HighGUI)

Cvaux - експериментальні та застарілі функції
- Простір. зір: стерео калібрація, сам калібрація
- пошук стерео-відповідності, кліки у графах
- знаходження та опис рис особи

CvCam - захоплення відео
- дозволяє здійснювати захоплення відео з цифрових відеокамер (підтримка припинена і в останніх версіях цей модуль відсутній)


Встановлення OpenCV під Linux

Після завантаження останньої версії OpenCV з сайту розробника http://sourceforge.net/projects/opencvlibrary/ потрібно розпакувати архів і виконати складання через CMake версії 2.6 або вище.

Установка CMake виконується стандартно:

Sudo apt-get install cmake

Для відображення вікон OpenCV потрібно встановити бібліотеки GTK+ 2.x і libgtk2.0-dev

Apt-get install libgtk2.0-dev

Збираємо бібліотеку:

Tar -xjf OpenCV-2.2.0.tar.bz2 cd OpenCV-2.2.0 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ./ make make install

Для тестування встановленої бібліотеки можна зібрати приклади і щось запустити:

Cd samples/c/ chmod +x build_all.sh ./build_all.sh ./delaunay

Якщо замість тестової картинки ви побачите помилку "error while loading shared libraries: libopencv_core.so.2.2: cannot open shared object file: No such file or directory", це означає, що програма може знайти бібліотеки. Потрібно явно вказати шлях до них:

$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

Якщо після цього знову помилка:
OpenCV Error: Unspecified error (функція не здійснена. Rebuild the library with Windows, GTK+ 2.x or Carbon support. або configure script) в cvNamedWindow, файл /usr/src/OpenCV-2.2.0/modules/highgui/src/window.cpp, line 274 terminate called after throwing instance of "cv::Exception" what(): /usr /src/OpenCV-2.2.0/modules/highgui/src/window.cpp:274: error: (-2) Ця функція не здійснена. Rebuild the library with Windows, GTK+ 2.x або Carbon support. Якщо ви є на Ubuntu або Debian, натисніть libgtk2.0-dev і pkg-config, повторюйте дзвінок або configure script in function cvNamedWindow
Ви забули встановити GTK+ 2.x: libgtk2.0-dev. Запустіть інсталяцію (див. вище).

Коли установка завершена заголовки будуть доступні в директорії /usr/local/include/opencv , а бібліотечні файли лежать в /usr/local/lib

Зберемо програму з OpenCV:

test.cpp

// // for testing // // Robocraft.ru // #include #include #include #include int main(int argc, char* argv) ( IplImage* image=0, *dst=0; // ім'я картинки char filename = "Image0.jpg"; // отримуємо картинку image = cvLoadImage(filename, 1); printf( "[i] image: %s\n", filename); assert(image != 0); // покажемо зображення cvNamedWindow("image"); cvShowImage("image", image); // чекаємо натискання клавіші cvWaitKey( 0), // звільняємо ресурси cvReleaseImage(& image); cvReleaseImage(&dst); // видаляємо вікна cvDestroyAllWindows();

Makefile

CC:= g++ CFLAGS:= -I/usr/local/include/opencv -L/usr/local/lib OBJECTS:= LIBRARIES:= -lopencv_core -lopencv_imgproc -lopencv_highgui . ) $(CFLAGS) -o test test.cpp $(LIBRARIES) clean: rm -f *.o

Запуск збірки командою make.


Hello World!

OpenCV встановлений та готовий до роботи. Напишемо свій перший додаток Hello World!

#include #include int main(int argc, char** argv) ( // задаємо висоту і ширину картинки int height = 620; int width = 440; // задаємо точку для виведення тексту CvPoint pt = cvPoint(height/4, width/2); // Створюємо 8-бітну, 3-канальну картинку IplImage* hw = cvCreateImage(cvSize(height, width), 8, 3);// заливаємо картинку чорним кольором cvSet(hw,cvScalar(0,0,0)); / ініціалізація шрифту CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); 0, 150));// створюємо віконце cvNamedWindow("Hello World", 0); // показуємо картинку у створеному вікні cvShowImage("Hello World", hw); // чекаємо натискання клавіші cvWaitKey(0); // звільняємо ресурси cvReleaseImage(&hw);cvDestroyWindow("Hello World"); return 0;

Завантаження зображення

Цей приклад буде основою всіх ваших програм на OpenCV. Ми завантажимо у середу зображення з файлу Image0.jpg

#include #include #include #include IplImage* image = 0; IplImage* src = 0; int main(int argc, char* argv) ( // ім'я картинки задається першим параметром char* filename = argc == 2 ? argv : "Image0.jpg"; // отримуємо картинку image = cvLoadImage(filename,1); // клонуємо картинку src = cvCloneImage(image); printf("[i] image: %s\n", filename); assert(src != 0); / показуємо картинку cvShowImage("original",image); // виводимо в консоль інформацію про картинку printf("[i] channels: %d\n", image->nChannels); printf("[i] pixel depth: % d bits\n", image->depth); printf("[i] width: %d pixels\n", image->width); printf("[i] height: %d pixels\n", image- >height);printf("[i] image size: %d bytes\n", image->imageSize); printf("[i] width step: %d bytes\n", image->widthStep); // чекаємо натискання клавіші cvWaitKey(0);// звільняємо ресурси cvReleaseImage(& image);cvReleaseImage(&src);

Типи форматів зображень, що підтримуються:

  • Windows bitmaps - BMP, DIB
  • JPEG files - JPEG, JPG, JPE
  • Portable Network Graphics - PNG
  • Portable image format - PBM, PGM, PPM
  • Sun rasters - SR, RAS
  • TIFF files - TIFF, TIF

Для отримання доступу до зображення можна здійснювати такі дзвінки:

Image->nChannels // число каналів картинки (RGB, хоча OpenCV - BGR) (1-4) image->depth // глибина в бітах image->width // ширина картинки в пікселях image->height // висота картинки в пікселях image->imageSize // пам'ять займана картинкою (==image->height*image->widthStep) image->widthStep // відстань між сусідніми по вертикалі точками зображення (число байт в одному рядку картинки - може знадобитися для самостійного обходу всіх пікселів зображення)

Завантаження відео

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

#include #include #include #include IplImage* frame =0; int main(int argc, char* argv) ( // ім'я файлу задається першим параметром char* filename = argc == 2 ? argv : "test.avi"; printf("[i] file: %s\n", filename ); // вікно для відображення картинки cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // отримуємо інформацію про відео-файл CvCapture* capture = cvCreateFileCapture(filename); while(1)( // отримуємо наступний кадр frame = cvQueryFrame(capture) if(!frame) ( break; ) // тут можна вставити // процедуру обробки // показуємо кадр cvShowImage("original", frame); char c = cvWaitKey(33); if (c == 27) ( // якщо натиснуто ESC - виходимо break; ) ) // звільняємо ресурси cvReleaseCapture(&capture); // видаляємо вікно cvDestroyWindow("original"); return 0; )

Для захоплення відео з камери потрібно трохи модифікувати код замість функції cvCreateFileCapture() буде використовуватися cvCreateCameraCapture(). При натисканні ESC відтворення перерветься і закриється вікно, а при натисканні Enter поточний кадр збережеться в jpg файл.

#include #include #include #include int main(int argc, char* argv) ( // отримуємо будь-яку підключену камеру CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); //cvCaptureFromCAM(0); assert(capture); //cvSetCaptureProperty(capture, CV_CAP) /1280); //cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);//960); // Дізнаємося ширину і висоту кадру double width = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH); double height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); printf("[i] %.0f x %.0f\n", width, height); IplImage* frame=0; cvNamedWindow("capture", CV_WINDOW_AUTOSIZE); printf("[i] press Enter for capture image and Esc for quit!\n\n"); int counter = 0; char filename; while(true)( // отримуємо кадр frame = cvQueryFrame(capture); // показуємо cvShowImage("capture", frame); char c = cvWaitKey(33); if (c == 27) ( // натиснута ESC break; ) else if(c == 13) ( // Enter // зберігаємо кадр у файл sprintf(filename, "Image%d.jpg", counter); printf("[i] capture... %s\n", filename), cvSaveImage(filename, frame); counter++; ) ) // звільняємо ресурси cvReleaseCapture(&capture); cvDestroyWindow("capture"); return 0; )

OpenCV v1.0 показує та зберігає картинку мінімальної роздільної здатності камери 320x240.


Розпізнавання об'єктів за шаблоном

Для розпізнавання областей на вихідному зображенні шаблону існує функція cvMatchTemplate(). Функція накладає шаблон зображення на поточне зображення і згідно з вибраним алгоритмом виконує пошук кореляції між ними. Визначення меж знайденого шаблону на вихідному зображенні виконується функцією cvMinMaxLoc, а для нормалізації алгоритму пошуку cvNormalize().

// // приклад cvMatchTemplate() // порівняння зображення із шаблоном // #include #include #include #include IplImage* image = 0; IplImage* templ = 0; int main(int argc, char* argv) ( // ім'я картинки задається першим параметром char* filename = argc >= 2 ? argv : "Image0.jpg"; // отримуємо картинку image = cvLoadImage(filename,1); printf( "[i] image: %s\n", filename); assert(image != 0); // шаблон char* filename2 = argc >= 3 ? argv : "eye.jpg"; printf("[i] template : %s\n", filename2); templ = cvLoadImage(filename2,1); assert(templ != 0); cvNamedWindow("original", CV_WINDOW_AUTOSIZE); , CV_WINDOW_AUTOSIZE), cvNamedWindow("res", CV_WINDOW_AUTOSIZE); // розмір шаблону int width = templ->width; int height = templ->height; template", templ); // зображення для зберігання результату порівняння // розмір результату: якщо image WxH і templ wxh, то result = (W-w+1)x(H-h+1) IplImage *res = cvCreateImage(cvSize ((image->width-templ->width+1), (image->height-templ->height+1)), IPL_DEPTH_32F, 1); // порівняння зображення із шаблоном cvMatchTemplate(image, templ, res, CV_TM_SQDIFF); // покажемо, що отримали cvShowImage("res", res); // визначення найкраще положення для порівняння // (Пошук мінімумів і максимумів на зображенні) double minval, maxval; CvPoint minloc, maxloc; cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0); // нормалізуємо cvNormalize(res,res,1,0,CV_MINMAX); cvNamedWindow("res norm", CV_WINDOW_AUTOSIZE); cvShowImage("res norm", res); // виділимо область прямокутником cvRectangle(image, cvPoint(minloc.x, minloc.y), cvPoint(minloc.x+templ->width-1, minloc.y+templ->height-1), CV_RGB(255, 0 , 0), 1, 8); // показуємо зображення cvShowImage("Match", image); // Чекаємо натискання клавіші cvWaitKey(0); // звільняємо ресурси cvReleaseImage(&image); cvReleaseImage(&templ); cvReleaseImage(&res); cvDestroyAllWindows(); return 0; )