Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00

Самостоятельная работа 1: Сборка и установка библиотеки OpenCV. Использование библиотеки в среде Microsoft Visual Studio

< Лекция 7 || Самостоятельная работа 1: 1234567891011 || Самостоятельная работа 2 >
4.3. Разработка приложения для определения контуров объектов

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

Сначала создадим решение и проект 01_Contours согласно схеме, описанной в разделе 3.1, и добавим файл исходного кода, в который поместим основную функцию main.

Опираясь на рассмотренные ранее операции работы с изображениями, последовательность действий можно представить следующим образом:

  1. Загрузить исходное изображение.
    // загрузка исходного изображения 
    Mat src = imread("apple.bmp", 1); 
    if (src.data == 0) 
    { 
      printf("Incorrect image name or format.\n"); 
      return 1; 
    } 
    
  2. Создать копию изображения, т.к. впоследствии необходимо видеть не только изображение с отрисованными контурами, но и исходное.
    // создание копии исходного изображения 
    Mat copy = src.clone(); 
    
  3. Конвертировать копию изображения в оттенки серого.
    Mat gray; 
    cvtColor(src, gray, CV_BGR2GRAY); 
    
  4. Выполнить бинаризацию полученного изображения. Операция необходима, т.к. функция поиска контуров работает на черно-белых изображениях.
    Mat grayThresh;   
    threshold(gray, grayThresh, 120, 255, CV_THRESH_BINARY);
    
  5. Определить контуры на бинарном изображении.
    // поиск контуров 
    vector<vector<Point> > contours; 
    findContours(grayThresh, contours, CV_RETR_CCOMP,  
                 CV_CHAIN_APPROX_SIMPLE); 
                 
  6. Отобразить исходное изображение и его копию с отрисованными контурами объектов.
    // создание окон для отображения 
    const char *srcWinName = "src",  
               *contourWinName = "contour"; 
    namedWindow(srcWinName, 1);  
    namedWindow(contourWinName,1); 
     
    // отображение контуров 
    Scalar color(0, 255, 0); 
    drawContours(copy, contours, -1, color, 2); 
     
    // отображение изображений 
    imshow(contourWinName, copy); 
    imshow(srcWinName, src); 
     
    // ожидание нажатия какой-либо клавиши 
    waitKey(0); 
    
  7. Освободить все занятые ресурсы.
    // освобождение ресурсов 
    gray.release(); 
    grayThresh.release(); 
    copy.release(); 
    src.release(); 
    
4.4. Запуск приложения и анализ результатов

Исходный код приложения разработан, поэтому осталось его запустить, нажав, например, комбинацию клавиш Ctrl+F5. На рис.8.22 показан результат исполнения приложения, полученный на тестовом изображении. Посмотрим внимательно на исходное изображение и полученные контуры, попробуем проинтерпретировать результат.

Результат работы приложения для определения контуров  объектов

Рис. 8.22. Результат работы приложения для определения контуров объектов

Первый шаг, который выполняется в приложении, – это конвертация исходного изображения в оттенки серого. Результат показан на рис.8.23 (слева). Затем выполняется отсечение с порогом интенсивности 120, т.е. для всех пикселей, интенсивность которых меньше 120, в бинарном изображении будет поставлен черный цвет, в противном случае, белый (рис.8.23, справа). Уже из бинарного изображения можно приблизительно оценить контуры. Заметим, что блики на объекте воспринимаются как отдельные компоненты, т.к. они соответствуют перепадам интенсивности. Очевидно, что контуры, которые определяются на основании бинарного изображения, отвечают контурам компонент связности.

Результаты выполнения промежуточных операций  преобразования изображения в оттенки серого (слева) и  отсечения (справа)

Рис. 8.23. Результаты выполнения промежуточных операций преобразования изображения в оттенки серого (слева) и отсечения (справа)
< Лекция 7 || Самостоятельная работа 1: 1234567891011 || Самостоятельная работа 2 >
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "