При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Сборка и установка Intel® Integrated Performance Primitives. Использование библиотеки в среде Microsoft® Visual Studio
5.3. Схема решения задачи поиска прямых линий на цветном изображении с использованием преобразования Хафа
Схема решения задачи поиска прямых линий на цветном изображении с использованием преобразования Хафа включает несколько этапов:
- Загрузка изображения.
- Преобразование изображения в оттенки серого.
- Поиск ребер на полученном изображении. Ребра можно найти, например, с использованием детектора Канни. Различные способы выделения ребер были рассмотрены в лабораторной работе "Базовые операции обработки изображений".
- Применение преобразования Хафа к бинарному изображению, содержащему ребра.
- Преобразование полученных параметров прямых из полярной системы координат в декартову систему, связанную с исходным изображением.
5.4. Общая структура приложения и основной функции
Приложение состоит из основной функции и модуля hough_transform, содержащего две функции, которые реализуют поиск прямых линий средствами библиотек Intel® IPP и OpenCV соответственно, а также функцию отображения результирующего набора линий на изображении.
Рассмотрим структуру основной функции. На входе программы имеется цветное изображение, поэтому функция имеет единственный параметр командной строки. Основная функция включает выполнение нескольких действий:
- Загрузка исходного изображения с использованием функции imread библиотеки OpenCV.
- Вызов функции поиска прямых линий hough_opencv, реализованной в модуле hough_transform, которая выполняет поиск средствами OpenCV.
- Вызов функции hough_ipp, также реализованной в модуле hough_transform. Функция выполняет определение прямых линий с использованием преобразования Хафа, реализованного в библиотеке Intel® IPP.
- Отображение исходных изображений с отрисованным набором прямых линий.
- Освобождение ресурсов, использованных для работы с изображениями.
#include <opencv2/opencv.hpp> #include "hough_transform.h" using namespace cv; char helper[] = "02_IPP_HoughTransform.exe <image>\n\ \t<image> - image name\n"; int main(int argc, char **argv) { Mat srcImgOCV, srcImgIPP, dstImgOCV, dstImgIPP; vector<Point> points1OCV, points2OCV, points1IPP, points2IPP; if (argc < 2) { printf("%s", helper); return 1; } // 1. загрузить изображение srcImgOCV = imread(argv[1]); if (srcImgOCV.data == 0) { printf("ERROR!!! imread(...)"); return 1; } srcImgOCV.copyTo(srcImgIPP); // 2. поиск прямых средствами OpenCV hough_opencv(srcImgOCV, points1OCV, points2OCV); // 3. поиск прямых средствами IPP hough_ipp(srcImgIPP, points1IPP, points2IPP); // 4. отобразить то, что получилось drawLines(srcImgOCV, points1OCV, points2OCV); drawLines(srcImgIPP, points1IPP, points2IPP); namedWindow("OpenCV"); imshow("OpenCV", srcImgOCV); namedWindow("IPP"); imshow("IPP", srcImgIPP); waitKey(); // 5. освободить память srcImgOCV.release(); srcImgIPP.release(); dstImgOCV.release(); dstImgIPP.release(); return 0; }
5.5. Реализация поиска прямых с использованием функций библиотеки OpenCV
Перейдем к рассмотрению функции hough_opencv. Функция принимает в качестве входных параметров исходное изображение srcImg и два вектора точек points1 и points2, каждая пара определяет прямую линию.
В начале блока функции объявим необходимые переменные.
int hough_opencv(const Mat &srcImg, vector<Point> &points1, vector<Point> &points2) { Mat edges, grayImg; vector<Vec2f> lines; double threshold1 = 50, threshold2 = 200, rhoStep = 1, thetaStep = CV_PI / 180; int houghThreshold = 100, kLines, i;
Затем выполним преобразование цветного изображения в оттенки серого посредствам вызова функции cvtColor.
cvtColor(srcImg, grayImg, CV_RGB2GRAY);
Для полученного полутонового изображения выполним поиск ребер на изображении с использованием детектора Канни. Схема работы алгоритма Канни и описание параметров соответствующей функции библиотеки OpenCV было приведено в лабораторной работе "Базовые операции обработки изображений". Дополнительно выполним отображение бинарного изображения ребер.
Canny(grayImg, edges, threshold1, threshold2); namedWindow("Canny (OpenCV)"); imshow("Canny (OpenCV)", edges);
Далее к бинарному изображению, содержащему ребра, применим преобразование Хафа посредствам вызова функции HoughLines. Функция принимает следующий набор параметров:
- edges – исходное бинарное изображение ребер.
- lines – результирующий вектор прямых линий.
- rhoStep – шаг дискретизации сетки по радиусу.
- thetaStep – шаг дискретизации по углу наклона перпендикуляра.
- houghThreshold – порог, по которому выполняется отсечение ячеек (фактически минимальное количество точек в ячейке, чтобы линия с соответствующими параметрами была продетектирована).
HoughLines(edges, lines, rhoStep, thetaStep, houghThreshold);
Осталось преобразовать полученные параметрические координаты в декартову систему координат, связанную с изображением, и освободить память, использованную для хранения временных изображений.
kLines = lines.size(); for (i = 0; i < kLines; i++) { float rho = lines[i][0], theta = lines[i][1]; Point pt1, pt2; double cosTheta = cos(theta), sinTheta = sin(theta); double x0 = cosTheta * rho, y0 = sinTheta * rho; pt1.x = cvRound(x0 + 1000 * (-sinTheta)); pt1.y = cvRound(y0 + 1000 * cosTheta); pt2.x = cvRound(x0 - 1000 * (-sinTheta)); pt2.y = cvRound(y0 - 1000 * cosTheta); points1.push_back(pt1); points2.push_back(pt2); } grayImg.release(); edges.release(); return 0; }