При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Сравнение производительности некоторых алгоритмов в библиотеках 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. Кроме того считаем, что все эти функции возвращают время выполнения в секундах.