/
Gantsou
/
ComputerVision
Обзор
Документация
Войти
/
Gantsou
/
ComputerVision
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Part3/main.cpp
145 строк
6 KB
unknown
added
21 дек 2025, 17:02
21 дек 2025, 17:02
339082e
Код
Авторство
О чём код?
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <vector> #include <iomanip> using namespace cv; using namespace std; int main() { // 1. Загрузка изображения // Замените "image.jpg" на путь к вашему изображению Mat img = imread("image.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Ошибка: Невозможно загрузить изображение" << endl; return -1; } // 2. Применение пороговой обработки Mat thresh_fixe, thresh_otsu; double ret_fixe, ret_otsu; // Версия с фиксированным порогом ret_fixe = threshold(img, thresh_fixe, 127, 255, THRESH_BINARY); // Версия с методом Оцу ret_otsu = threshold(img, thresh_otsu, 0, 255, THRESH_BINARY + THRESH_OTSU); cout << "Использованный порог (фиксированный): " << ret_fixe << endl; cout << "Использованный порог (Оцу): " << ret_otsu << endl; // 3. Поиск контуров vector<vector<Point>> contours_fixe, contours_otsu; vector<Vec4i> hierarchy_fixe, hierarchy_otsu; // Контуры на изображении с фиксированным порогом findContours(thresh_fixe, contours_fixe, hierarchy_fixe, RETR_TREE, CHAIN_APPROX_SIMPLE); // Контуры на изображении с порогом Оцу findContours(thresh_otsu, contours_otsu, hierarchy_otsu, RETR_TREE, CHAIN_APPROX_SIMPLE); cout << "Найдено контуров (фиксированный): " << contours_fixe.size() << endl; cout << "Найдено контуров (Оцу): " << contours_otsu.size() << endl; // 4. Отрисовка контуров на исходном изображении // Преобразуем в цветное изображение Mat img_color, img_with_contours; cvtColor(img, img_color, COLOR_GRAY2BGR); img_with_contours = img_color.clone(); // Отрисовка контуров зеленым цветом drawContours(img_with_contours, contours_otsu, -1, Scalar(0, 255, 0), 2); // 5. Анализ контуров cout << "\nАнализ контуров (метод Оцу):" << endl; // Анализируем первые 5 контуров или меньше, если их меньше int num_contours_to_show = min(5, (int)contours_otsu.size()); for (int i = 0; i < num_contours_to_show; i++) { double area = contourArea(contours_otsu[i]); double perimeter = arcLength(contours_otsu[i], true); cout << "Контур " << i << ":" << endl; cout << " - Точки: " << contours_otsu[i].size() << endl; cout << fixed << setprecision(2); cout << " - Площадь: " << area << endl; cout << " - Периметр: " << perimeter << endl; // Вычисление ограничивающего прямоугольника Rect bounding_rect = boundingRect(contours_otsu[i]); cout << " - Прямоугольник: (" << bounding_rect.x << ", " << bounding_rect.y << "), " << bounding_rect.width << "x" << bounding_rect.height << endl; // Отрисовка прямоугольника синим цветом rectangle(img_with_contours, bounding_rect, Scalar(255, 0, 0), 2); } // 6. Создание изображений для визуализации // Контуры на фиксированном пороге Mat img_contours_fixe; cvtColor(thresh_fixe, img_contours_fixe, COLOR_GRAY2BGR); drawContours(img_contours_fixe, contours_fixe, -1, Scalar(0, 255, 0), 2); // Контуры на пороге Оцу Mat img_contours_otsu; cvtColor(thresh_otsu, img_contours_otsu, COLOR_GRAY2BGR); drawContours(img_contours_otsu, contours_otsu, -1, Scalar(0, 255, 0), 2); // 7. Отображение результатов в отдельных окнах namedWindow("Исходное изображение", WINDOW_NORMAL); namedWindow("Фиксированный порог", WINDOW_NORMAL); namedWindow("Порог Оцу", WINDOW_NORMAL); namedWindow("Контуры (фикс.)", WINDOW_NORMAL); namedWindow("Контуры (Оцу)", WINDOW_NORMAL); namedWindow("Контуры + Прямоугольники", WINDOW_NORMAL); // Изменяем размер окон для удобного просмотра resizeWindow("Исходное изображение", 400, 400); resizeWindow("Фиксированный порог", 400, 400); resizeWindow("Порог Оцу", 400, 400); resizeWindow("Контуры (фикс.)", 400, 400); resizeWindow("Контуры (Оцу)", 400, 400); resizeWindow("Контуры + Прямоугольники", 400, 400); imshow("Исходное изображение", img); imshow("Фиксированный порог", thresh_fixe); imshow("Порог Оцу", thresh_otsu); imshow("Контуры (фикс.)", img_contours_fixe); imshow("Контуры (Оцу)", img_contours_otsu); imshow("Контуры + Прямоугольники", img_with_contours); // 8. Отображение иерархии cout << "\nПример иерархии (первые " << num_contours_to_show << " контуров):" << endl; for (int i = 0; i < num_contours_to_show; i++) { Vec4i hier = hierarchy_otsu[i]; cout << "Контур " << i << ": [следующий=" << hier[0] << ", предыдущий=" << hier[1] << ", потомок=" << hier[2] << ", родитель=" << hier[3] << "]" << endl; } // 9. Сохранение результатов imwrite("seuillage_fixe.jpg", thresh_fixe); imwrite("seuillage_otsu.jpg", thresh_otsu); imwrite("contours_resultat.jpg", img_with_contours); // 10. Ожидание нажатия клавиши cout << "\nНажмите любую клавишу для выхода..." << endl; waitKey(0); // Закрытие всех окон destroyAllWindows(); return 0; }