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

Самостоятельная работа 6: Сравнение производительности некоторых алгоритмов в библиотеках OpenCV и IPP

2.4. Функция main

Перейдем теперь к разработке функции main(). Прежде всего необходимо подключить заголовочные файлы. Кроме функций из библиотек OpenCV и IPP нам потребуется также вывод сообщений на консоль с помощью printf() и замеры времени с использованием функции clock().

#include <stdio.h> 
#include <time.h> 
#include <opencv2/opencv.hpp> 
#include <ippi.h> 
#include <ippcc.h> 

Для более удобной работы с OpenCV подключим пространство имен cv.

 
using namespace cv; 

Имя файла с изображением будем передавать через командную строку.

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

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

char helper[] =    "01_OpenCVvsIPP.exe <img_name> <mode> <num_of_exp>\n\ 
  \t<img_name> - image filename\n\ 
  \t<mode>:\n\ 
  \t\t1 - median filtering\n\ 
  \t\t2 - erode\n\ 
  \t\t3 - dilate\n\ 
  \t\t4 - calc histogram\n\ 
  \t<num_of_exp> - number of experiments\n"; 
 
int main(int argc, char *argv[]) 
{ 
  Mat srcImgOCV, srcImgIPP, dstImgOCV, dstImgIPP; 
  int mode, i; 
  double ocv_time, ipp_time; 
 
  if (argc < 4) 
  { 
    printf("%s", helper); 
    return 1; 
  } 
 
  // загрузить изображение 
  srcImgOCV = imread(argv[1]); 
  if (srcImgOCV.data == 0) 
  { 
    printf("ERROR!!! imread(...)"); 
    return 1; 
  } 
  srcImgOCV.copyTo(srcImgIPP); 
 
  mode = atoi(argv[2]); 
  switch (mode) 
  { 
  case 1: 
    // отфильтровать с помощью OpenCV 
    ocv_time = median_opencv(srcImgOCV, dstImgOCV); 
    // отфильтровать с помощью IPP 
    ipp_time = median_ipp(srcImgIPP, dstImgIPP); 
    break; 
  case 2: 
    // выполнить эрозию с помощью OpenCV 
    ocv_time = erode_opencv(srcImgOCV, dstImgOCV); 
    // выполнить эрозию с помощью IPP 
    ipp_time = erode_ipp(srcImgIPP, dstImgIPP); 
    break; 
  case 3: 
    // выполнить дилатацию с помощью OpenCV 
    ocv_time = dilate_opencv(srcImgOCV, dstImgOCV); 
    // выполнить дилатацию с помощью IPP 
    ipp_time = dilate_ipp(srcImgIPP, dstImgIPP);     break; 
  case 4: 
    // вычислить гистограмму с помощью OpenCV 
    ocv_time = hist_opencv(srcImgOCV, dstImgOCV); 
    // вычислить гистограмму с помощью IPP 
    ipp_time = hist_ipp(srcImgIPP, dstImgIPP); 
    break; 
  } 
 
  printf("ocv time is %.3f\nipp time is %.3f", ocv_time, 
    ipp_time); 
 
  // освободить память 
  srcImgOCV.release(); 
  srcImgIPP.release(); 
  dstImgOCV.release(); 
  dstImgIPP.release(); 
 
  return 0; 
} 

Предполагается, что каждая из выделенных полужирным шрифтом функций принимает на вход изображение в виде объекта типа Mat из OpenCV, выполняет требуемый алгоритм и возвращает новое изображение также в виде объекта типа Mat. Кроме того считаем, что все эти функции возвращают время выполнения в секундах.

Андрей Терёхин
Андрей Терёхин

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

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

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

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