/
RDA
/
STZ
Обзор
Документация
Войти
/
RDA
/
STZ
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
lab6/lab6_detect_3_perspect.cpp
125 строк
4 KB
daniil rybyakov
1
11 мар 2025, 17:55
11 мар 2025, 17:55
04282df
Код
Авторство
О чём код?
#include <opencv2/opencv.hpp> #include <iostream> #include <vector> #include <Eigen/Dense> #include "skelet.hpp" double degree_to_rad(double angle) { return angle * M_PI / 180; } cv::Scalar bar_to_hsv(int hb, int sb, int vb) { double h = (double)hb / 360 * 180; double s = (double)sb / 100 * 255; double v = (double)vb / 100 * 255; return cv::Scalar(h, s, v); } int draw_circle(cv::Mat& input_img, cv::Point p) { cv::circle(input_img, p, 3, cv::Scalar(0, 0, 0), cv::FILLED); return 0; } int draw_map(cv::Mat& input_img, int step, const cv::Mat base_img) { // Однотонный фон cv::Mat img(base_img.size(), CV_8UC3, cv::Scalar(200, 200, 200)); // Вертикальные и горизонтальные линии for(int l = 0; l < img.rows; l += step) { cv::line(img, cv::Point(0, l), cv::Point(img.cols, l), cv::Scalar(150, 150, 150), 1); cv::putText(img, std::to_string((img.rows - l - 1)/3), cv::Point(5, l-5), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0), 1); } for(int c = 0; c < img.cols; c += step*2) { cv::line(img, cv::Point(c, 0), cv::Point(c, img.rows), cv::Scalar(150, 150, 150), 1); } input_img = img; return 0; } cv::Point sk2(cv::Point p, cv::Mat img) // переворот координаты y { return cv::Point(p.x, img.rows-1 - p.y); } int main() { std::string filePath = "src/calib_1_0.jpg"; int h_low = 80; int s_low = 0; int v_low = 60; int h_height = 209; int s_height = 100; int v_height = 100; cv::Mat img_src = cv::imread(filePath, cv::IMREAD_COLOR); if (img_src.empty()) { std::cout << "Не удалось открыть изображение: " << filePath << std::endl; return 0; } std::cout << "Открыто изображение: " << filePath << std::endl; cv::namedWindow("map_img", cv::WINDOW_AUTOSIZE); cv::imshow("img", img_src); cv::Mat img_hsv; cv::cvtColor(img_src, img_hsv, cv::COLOR_BGR2HSV); cv::Mat mask; cv::inRange(img_hsv, bar_to_hsv(80, 0, 60), bar_to_hsv(209, 100, 100), mask); cv::imshow("green 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), 1); // скелетизация cv::Mat img_skelet = skelet(mask); cv::imshow("img_skelet", img_skelet); // трекбар int d_int = 100; cv::createTrackbar("d_int", "map_img", &d_int, 1000); double f = img_src.cols / (2 * tan(degree_to_rad(54) / 2)); while (1) { cv::Mat map_img; draw_map(map_img, 30, img_skelet); // создание карты // проход по пикселям for (int x = 0; x < img_skelet.cols; x++) for (int y = img_skelet.rows - 1; y > 0; --y) if (img_skelet.at<uchar>(cv::Point(x, y)) > 0){ // проверка на принадлежность скелету int yp = img_skelet.rows - y; // инверсия y int xp = x; double yl = img_skelet.rows/2 - yp; // относительно центра int L = (int)(f * (d_int/10 - yl) / yl + f); // рассчет глубины draw_circle(map_img, sk2(cv::Point(xp, L*3), map_img)); // рисование точки break; } cv::imshow("map_img", map_img); char key = (char)cv::waitKey(20); if (key == 27) break; } cv::destroyAllWindows(); return 0; }