/
RDA
/
STZ
Обзор
Документация
Войти
/
RDA
/
STZ
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
lab7/lab7_2_line.cpp
93 строки
4 KB
daniil rybyakov
1
11 мар 2025, 17:55
11 мар 2025, 17:55
04282df
Код
Авторство
О чём код?
#include <opencv2/opencv.hpp> #include <vector> #include <iostream> #include "skelet.hpp" // расстояние между точками double distanceBetweenPoints(const cv::Point& p1, const cv::Point& p2) { return std::sqrt(std::pow(p1.x - p2.x, 2) + std::pow(p1.y - p2.y, 2)); } int main() { cv::Mat img_src = cv::imread("src/2.jpg", cv::IMREAD_COLOR); if (img_src.empty()) { std::cout << "Не удалось открыть изображение: " << "img.jpg" << std::endl; return 1; } cv::imshow("Original Image", img_src); cv::namedWindow("img", cv::WINDOW_AUTOSIZE); int threshold = 66; int minLineLength = 70; int maxLineGap = 51; int mergeThreshold = 40; cv::createTrackbar("порог бин", "img", &threshold, 255); // пороговое значение для бинаризации cv::createTrackbar("мин длин лин", "img", &minLineLength, 100); // минимальная длина линии для алгоритма Хафа cv::createTrackbar("мин разрыв линий", "img", &maxLineGap, 100); // максимальный разрыв между частями одной линии cv::createTrackbar("порог обьед близ лин", "img", &mergeThreshold, 100); // порог для объединения близких линий while (1) { cv::Mat mask; // бинаризация cv::cvtColor(img_src, mask, cv::COLOR_BGR2GRAY); cv::threshold(mask, mask, threshold, 255, cv::THRESH_BINARY); //cv::imshow("mask", mask); // морфологическое расширение int morph_size = 1; cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2 * morph_size + 1, 2 * morph_size + 1), cv::Point(morph_size, morph_size)); cv::dilate(mask, mask, element, cv::Point(-1, -1), 2); //cv::imshow("dill", mask); // скелетизация mask = skelet(mask); cv::imshow("skelet", mask); // обнаружение линий std::vector<cv::Vec4i> lines; HoughLinesP(mask, lines, 1, CV_PI/1000, 50, (double)minLineLength, (double)maxLineGap); std::vector<cv::Vec4i> lines_connect; // объединение линий for (size_t i = 0; i < lines.size() - 1; i++) for (size_t j = i + 1; j < lines.size(); j++) { cv::Vec4i l1 = lines[i]; cv::Vec4i l2 = lines[j]; if (distanceBetweenPoints(cv::Point(l1[0], l1[1]), cv::Point(l2[0], l2[1])) < (double)mergeThreshold) lines_connect.push_back({l1[0], l1[1], l2[0], l2[1]}); if (distanceBetweenPoints(cv::Point(l1[0], l1[1]), cv::Point(l2[2], l2[3])) < (double)mergeThreshold) lines_connect.push_back({l1[0], l1[1], l2[2], l2[3]}); if (distanceBetweenPoints(cv::Point(l1[2], l1[3]), cv::Point(l2[0], l2[1])) < (double)mergeThreshold) lines_connect.push_back({l1[2], l1[3], l2[0], l2[1]}); if (distanceBetweenPoints(cv::Point(l1[2], l1[3]), cv::Point(l2[2], l2[3])) < (double)mergeThreshold) lines_connect.push_back({l1[2], l1[3], l2[2], l2[3]}); } lines.insert(lines.end(), lines_connect.begin(), lines_connect.end()); // Отрисовка найденных линий на изображении cv::Mat img = img_src.clone(); for (size_t i = 0; i < lines.size(); i++) { cv::Vec4i l = lines[i]; line(img, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0, 255, 0), 3); } cv::imshow("img", img); char key = (char)cv::waitKey(20); if (key == 27) break; } return 0; }