ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.11.2023
Просмотров: 19
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное
учреждение высшего образования
«Казанский национальный исследовательский технический
университет им. А.Н. Туполева-КАИ»
(КНИТУ-КАИ)
Институт компьютерных технологий и защиты информации
Кафедра Автоматизированные системы обработки информации и управления «Сomputer-центр»
Лабораторная работа № 1
по дисциплине: «Цифровая обработка изображений»
Выполнила:студент гр.4383
Тимергалиев И.Ф.
Проверил:
Казань 2022
Задание
-
Изучить основы программирования на языке C++ с использованием библиотеки OpenCV. -
Разработать программу рисования треугольников с сохранением результата в файле. -
Разработать программу создания и сохранения изображения, являющегося выделенной с помощью мыши прямоугольной областью другого изображения. -
Разработать программу создания и сохранения изображения, являющегося соединением частей других изображений.
Выполнение работы
1. Разработать программу рисования треугольников с сохранением результата в файле.
Код программы:
#include
#include
#include
using namespace cv;
void my_mouse_callback(int event, int x, int y, int flags, void* param);
Point p;
int main(int argc, char* argv[])
{
//создание холста
Mat image = Mat(Size(400, 400), CV_8UC3, Scalar(0, 0, 0));
//создание окна
namedWindow("triangle");
setMouseCallback("triangle", my_mouse_callback, (void*)&image);
imshow("triangle", image);
while (true)
{
//Задержка
int key = waitKey(30);
if (key == 27)
break;
}
destroyWindow("triangle");
return 0;
}
//Рисование линий для треугольника
void draw_triangle(Mat* image, Point p)
{
line(*image,
Point(p.x, p.y),
Point(p.x + 100, p.y),
Scalar(255, 255, 255));
line(*image,
Point(p.x, p.y),
Point(p.x, p.y + 50),
Scalar(255, 255, 255));
line(*image,
Point(p.x, p.y + 50),
Point(p.x + 100, p.y),
Scalar(255, 255, 255));
}
//обработка нажатий
void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
Mat* pimg = (Mat*)param;
switch (event)
{
case CV_EVENT_LBUTTONDOWN:
p.x = x;
p.y = y;
draw_triangle(pimg, p);
imshow("triangle", *pimg);
break;
case CV_EVENT_RBUTTONDOWN:
imwrite("triangle_image.png", *pimg);
break;
}
}
Рис 1. Программа, рисующая треугольники
Рис.2. Сохраненное изображение треугольников
2. Разработать программу создания и сохранения изображения, являющегося выделенной с помощью мыши прямоугольной областью другого изображения.
Код программы:
#include
#include
using namespace std;
using namespace cv;
void my_mouse_callback(int event, int x, int y, int flags, void* param);
bool down = false;
bool up = false;
Mat img;
Rect box;
Point pt1, pt2;
int main(int argc, char* argv[])
{
img = imread("image.png");
namedWindow("img");
imshow("img", img);
setMouseCallback("img", my_mouse_callback);
while (1)
{
int key = waitKey(30);
if (key == 27)
break;
}
return 0;
}
void my_mouse_callback(int event, int x, int y, int, void*)
{
//Берет начальные точки
if (event == EVENT_LBUTTONDOWN)
{
down = true;
pt1.x = x;
pt1.y = y;
}
if (event == EVENT_LBUTTONUP)
{
//Берет конечные точки
if (abs(x - pt1.x) > 20 && abs(y - pt1.y) > 20)
{
up = true;
pt2.x = x;
pt2.y = y;
}
else { down = false; }
}
//Рисует динамически, до отпускания ЛКМ
if (down == true && up == false)
{
Point pt;
pt.x = x;
pt.y = y;
Mat rect = img.clone();
rectangle(rect, pt1, pt, Scalar(0x00, 0x00, 0xff));
imshow("img", rect);
}
//Создает часть изображения в другом окне
if (down == true && up == true)
{
box.width = abs(pt1.x - pt2.x);
box.height = abs(pt1.y - pt2.y);
box.x = min(pt1.x, pt2.x);
box.y = min(pt1.y, pt2.y);
//Умеет копировать часть из введенного холста
Mat copyImg(img, box);
namedWindow("Cropped Image");
imshow("Cropped Image", copyImg);
imwrite("crop.png", copyImg);
down = false;
up = false;
}
}
Рис. 3 Исходное изображение
Рис. 4 Обрезанное изображение
3. Разработать программу создания и сохранения изображения, являющегося соединением частей других изображений.
Код программы:
#include
#include
using namespace cv;
void my_mouse_callback(int event, int x, int y, int flags, void* param);
Mat image;
Rect box = Rect(-1, -1, 0, 0);
Rect box2 = Rect(-1, -1, 0, 0);
int currentBox = 1;
bool drawingBox = false;
//Рисование прямоуольников
void draw_box(Mat* pimg, Rect rect)
{
rectangle(
*pimg,
Point(rect.x, rect.y),
Point(rect.x + rect.width, rect.y + rect.height),
Scalar(0, 0, 255));
}
int main(int argc, char* argv[])
{
image = imread("image.png");
Mat temp = image.clone();
namedWindow("Image", WINDOW_AUTOSIZE);
setMouseCallback("Image", my_mouse_callback, (void*)&image);
imshow("Image", temp);
while (1)
{
int key = cvWaitKey(30);
if (key == 27)
{
break;
}
image.copyTo(temp);
draw_box(&temp, box);
draw_box(&temp, box2);
imshow("Image", temp);
}
destroyWindow("Image");
return 0;
}
//Соединение изображений
void compoundBoxes()
{
int width = box.width + box2.width;
int height = max(box.height, box2.height);
Size size = Size(width, height);
Mat temp = Mat(size, CV_8UC3, Scalar(0xff, 0xff, 0xff));
//Заполнение попиксельно изображений
for (int valy = 0; valy < image.rows; valy++)
for (int valx = 0; valx < image.cols; valx++)
{
Vec3b val = image.at
if (valx >= box.x && valx < box.x + box.width &&
valy >= box.y && valy < box.y + box.height)
temp.at
if (valx >= box2.x && valx < box2.x + box2.width &&
valy >= box2.y && valy < box2.y + box2.height)
temp.at
}
box = Rect(-1, -1, 0, 0);
box2 = Rect(-1, -1, 0, 0);
namedWindow("Cropped Image");
imshow("Cropped Image", temp);
imwrite("crop.png", temp);
}
void my_mouse_callback(int event, int x, int y,
int flags, void* param)
{
Mat* pimg = (Mat*)param;
switch (event)
{
case CV_EVENT_MOUSEMOVE:
if (drawingBox)
{
if (currentBox == 1)
{
box.width = x - box.x;
box.height = y - box.y;
}
else if (currentBox == 2)
{
box2.width = x - box2.x;
box2.height = y - box2.y;
}
}
break;
//Начало создания разметки
case CV_EVENT_LBUTTONDOWN:
drawingBox = true;
if (currentBox == 1)
box = Rect(x, y, 0, 0);
else if (currentBox == 2)
box2 = Rect(x, y, 0, 0);
break;
//Конец создания разметки
case CV_EVENT_LBUTTONUP:
drawingBox = false;
if (box.width < 0)
{
box.x += box.width;
box.width *= -1;
}
if (box.height < 0)
{
box.y += box.height;
box.height *= -1;
}
if (box2.width < 0)
{
box2.x += box2.width;
box2.width *= -1;
}
if (box2.height < 0)
{
box2.y += box2.height;
box2.height *= -1;
}
if (currentBox == 1)
currentBox = 2;
else
{
currentBox = 1;
compoundBoxes();
}
break;
}
}
Рис. 5 Исходное изображение
Рис. 6 Объединенные части изображения