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