Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.09.2024
Сообщений: 5

Программа для векторизации битовых матриц

15.09.2024, 12:33. Показов 1211. Ответов 15

Студворк — интернет-сервис помощи студентам
здравствуйте, мне для учебной практики нужно написать простенький фоторедактор на С++, для ручной векторизации битовых матриц. я себе представляю его функционал так: использования битовых матриц в качестве фона (слоя для копирования), создание простых фигур, объединение простых фигур в сложные и сохранение их для повторного использования, сохранение векторных изображений в формате svg.

подскажите пожалуйста с чего начать, где посмотреть, что почитать, может стоит сменить язык. буду рад любой помощи.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2024, 12:33
Ответы с готовыми решениями:

Программа для просмотра битовых потоков
Собственно ищу такую, не могу найти. Подскажите, если кто знает.

GPU для алгоритма векторизации изображения
Добрый день, коллеги! Не уверен что пишу в правильную тему. Есть следующее задание: Если тут есть люди, которые разбираются в...

Использование векторизации для решения систем уравнений
Всем привет. Возникла проблема - маткад не решает систему уравнений, в которой есть массивы. Как это можно исправить? Файл прикладываю (в...

15
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 387
15.09.2024, 19:09
Лучший ответ Сообщение было отмечено aezakmier как решение

Решение

Прямо с места в карьер, да?
C++ для этого - как из пушки по воробьям. Но раз уж тебе для практики, то почему бы и нет. Садистские наклонности преподов я одобряю.
Начни с библиотеки OpenCV - она тебе жизнь спасет. Для работы с SVG глянь на Cairo или Boost.GIL. А чтобы не изобретать велосипед с интерфейсом, возьми Qt или wxWidgets.
Структуру данных для битовых матриц можешь сделать через std::vector<bool> или Boost.Dynamic_Bitset. Для векторных фигур - полиморфизм твой друг, создай базовый класс Shape и наследуйся от него.
Почитай про паттерны проектирования, особенно Composite для сложных фигур. И да, версионный контроль осваивай, если не хочешь поседеть раньше времени. А вообще, может, стоит начать с чего попроще? Python с PyQt и Pillow? Там кода меньше, и нервов целее будешь.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <vector>
#include <memory>
 
// Базовый класс для фигур
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() = default;
};
 
// Простая фигура - круг
class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Рисую круг\n";
    }
};
 
// Сложная фигура - группа фигур
class Group : public Shape {
    std::vector<std::unique_ptr<Shape>> shapes;
public:
    void add(std::unique_ptr<Shape> shape) {
        shapes.push_back(std::move(shape));
    }
    void draw() override {
        std::cout << "Рисую группу:\n";
        for (const auto& shape : shapes) {
            shape->draw();
        }
    }
};
 
// Простейший "редактор"
class Editor {
    std::vector<std::unique_ptr<Shape>> shapes;
public:
    void addShape(std::unique_ptr<Shape> shape) {
        shapes.push_back(std::move(shape));
    }
    void drawAll() {
        for (const auto& shape : shapes) {
            shape->draw();
        }
    }
};
 
int main() {
    Editor editor;
    
    editor.addShape(std::make_unique<Circle>());
    
    auto group = std::make_unique<Group>();
    group->add(std::make_unique<Circle>());
    group->add(std::make_unique<Circle>());
    editor.addShape(std::move(group));
    
    editor.drawAll();
    
    return 0;
}

Вот тебе базовый скелет. Тут есть абстрактный класс Shape, от которого наследуются конкретные фигуры (пока только Circle) и группа фигур (Group). Editor - это твой "холст", куда ты добавляешь фигуры.
Это, конечно, еще не векторный редактор, а так, пальцем по воде. Но принцип ты уловишь:
Полиморфизм для разных типов фигур.
Паттерн Composite для групп фигур.
std::unique_ptr для управления памятью (чтобы не подстрелить себя в ногу).

Дальше тебе нужно:
Добавить реальные координаты и отрисовку (OpenCV в помощь).
Прикрутить GUI (Qt или wxWidgets).
Реализовать сохранение в SVG (Cairo или что-то подобное).
Добавить функции редактирования (перемещение, масштабирование и т.д.).
1
0 / 0 / 0
Регистрация: 15.09.2024
Сообщений: 5
15.09.2024, 20:08  [ТС]
спасибо большое! На самом деле выбор С++ это лично мой выбор. Так как в нём я чувствую себя более уверенным. Но для меня это не принципиально. Я был бы рад избавить себя от лишних проблем с помощью пайтон, но я не работал с ним, только основы пару лет назад изучил.
Насколько более простым будет решение поставленной задачи, если использовать пайтон, по сравнению с С++?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.09.2024, 20:30
karlhildekruger, зачем тут OPENCV ?
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,040
16.09.2024, 00:13
opencv даёт отдельное окошко.
В него выводиться тип данных cv::Mat. Наверное от слова матрица.
Между этими типами данных, возможны различные преобразования.
Существуют различные функции для них. Или пересчёт в ручную.
C++ будет, как бы для склейки всего этого безобразия.
На окошко ставяться движки. Есть хук на мышь.
Чего не хватает то можно зацепить из winapi.
Кто любит ку те. То конечно.
Я писал гуй на нём же. На opencv.

Примерно вот такой вот стиль получился.
Это два окошка opencv.
2
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,040
16.09.2024, 00:40
Вот такая мышь на нём. Всё до безобразия в ручную...
Это на окно с кнопками.
А консоль я просто спрятал.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//----------------------------------------------
//            мышка на управление
//----------------------------------------------
void myMouseCallback1( int event, int x, int y, int flags, void* param )
{     Rect r; short z(54); cv::Mat Set;
                        switch( event ){
 case CV_EVENT_MOUSEMOVE:
 //----------
if(x > rc.x && x < rc.x + rc.width && y > rc.y && y < rc.y + rc.height)// <===== Замазать все image  цветом
{ r=Rect(424, 0, 32, 18); rectangle(safe::src,r,Scalar(0,255,0),1,8,0);}// --- Обводка маленькой else {r=Rect(424, 0, 32, 18); rectangle(safe::src,r,Scalar(105,126,141),1,8,0);}
 //----------
                           if(x>14 && x<122 && y>38 && y<60){// <=== размазать 5x5...
           r=Rect(14,38,122-14,60-38);           // === рисовать рамочки на кнопочках
rectangle(safe::src,r,Scalar(0,255,0),2,8,0);
            } else {
r=Rect(14,38,122-14,60-38);
rectangle(safe::src,r,Scalar(252,88,11),2,8,0);
                    }
Добавлено через 4 минуты
А колесо уже на winApi.
Колеса я там не нашёл.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// === Глобальный хук на мышь(колесо) ===== UnhookWindowsHookEx(MouseHook); //-- Снять захват (Надо снимать ХУК)  Win_X
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
 {  
if (nCode == HC_ACTION) {
switch (wParam) {
       case  WM_MOUSEWHEEL:
//------------------------
const MSLLHOOKSTRUCT *mhs = (const MSLLHOOKSTRUCT *)lParam;
  if((short)HIWORD(mhs->mouseData) >0 ){
    // ------------ увеличивать колесом размер вставки до предела краёв большой картинки (последний щелчок не учитывает)
            safe::zDelta +=.025;
if(Win_X + region.width * safe::zDelta >= safe::out_image.cols || Win_Y + region.height * safe::zDelta >= safe::out_image.rows)
      safe::zDelta -=.025;
              //=========
if (!safe::Roi_for.data && region.width == 0 && region.height == 0) safe::resize_full += .025;// <----------- большая картинка на ПЛЮС
  {
Добавлено через 6 минут
Цитата Сообщение от karlhildekruger Посмотреть сообщение
Реализовать сохранение в SVG (Cairo
opencv сохраняет....

Добавлено через 2 минуты
Может .png... Может .jpg...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //------------------------
    result = MessageBox(NULL, L"Conversion to jpg ?  (compression 75)", L"QUESTION",  MB_YESNOCANCEL);
 Mat exit; // для перекодирования в jpg    
            vector<int> compression_params;//   если это jpg  то качество 100   JPEG
    compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
    compression_params.push_back(75);// Качество jpg 73 для ватсап 
switch (result)
{
case IDYES:
    // Do something
 cvtColor(exit_pict, exit, CV_BGRA2BGR,3);// убрать альфа канал
 *strrchr(safe::szFile, '.')='\0'; // ====== ноль вместо последнего точки;
strcat_s(safe::szFile,".jpg");// --- добавим расширение
 imwrite(safe::szFile, exit, compression_params);//расширение файла должно соответствовать 
       //                         а то преобразование формата не получаеться
  safe::ex_it=true;// вылет из программы
    break;
Добавлено через 1 минуту
Цитата Сообщение от karlhildekruger Посмотреть сообщение
Дальше тебе нужно:
Добавить реальные координаты и отрисовку (OpenCV в помощь).
Прикрутить GUI (Qt или wxWidgets).
Фантазия у вас богатая. Счастливый.

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
зачем тут OPENCV
На opencv обсчитывают картинку.
А зачем там ку те не знаю.

Добавлено через 3 минуты
Цитата Сообщение от aezakmier Посмотреть сообщение
простенький фоторедактор
====
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,040
16.09.2024, 00:47
final_file.mp4
Фоторедактор получаеться. Только не очень простенький.
И не совсем до конца доделаный.
Как бы это проще сказать. Такая субстанция.
Чем больше отгребаешь, тем больше в ней тонешь.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.09.2024, 00:59
Матрицы - это одно, абстрактные данные.
Канва и их (матриц) отрисовка - совсем другое.
Фигуры и их композиции уже третье.
Их(фигур/композиций) отрисовка/отображение на канве или матрице, уже четвертое.
И так далее, не нужно винипуховгретов делать.

Подключение OpenCV, не принесет ни простоты, ни радости, ни сбережение нервов.
Его изучение и использование - не на один учебный проект.
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,040
16.09.2024, 01:10
А как ты будешь на канве формы обрабатывать картинку?
На winApi что ли?
Вообщем...
Фсё фигня кроме пчёл.
И пчёлы тоже фигня.
Правда в том, что ни чего путного всё равно не напишешь.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.09.2024, 01:47
Цитата Сообщение от aezakmier Посмотреть сообщение
векторизации битовых матриц
А это вообще не гуглится
Хау ду ю ду, что ТС имел ввиду ?
1
0 / 0 / 0
Регистрация: 15.09.2024
Сообщений: 5
16.09.2024, 05:02  [ТС]
Мне нужно сделать копию пиксельного рисунка(в виде бытовой матрицы) с помощью векторной графики.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.09.2024, 10:19
Цитата Сообщение от aezakmier Посмотреть сообщение
Мне нужно сделать копию пиксельного рисунка(в виде бытовой матрицы) с помощью векторной графики.
Это никак не пролило свет на задачу.

Я (да и не только я, гугл в том числе) многого не знаю.

Что такое битовая матрица ?
И как она соотносится к растровому изображению и векторной графики одновременно ???
(выделенное зеленым, я знаю что такое)
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.09.2024, 11:33
Цитата Сообщение от aezakmier Посмотреть сообщение
Мне нужно сделать копию пиксельного рисунка(в виде бытовой матрицы) с помощью векторной графики.
Пиксельный (вернее растровый) рисунок перевести в векторный формат, правильно я понял?

Если так, то сколько уже диссертаций на эту тему написано! и сколько ещё будет
0
0 / 0 / 0
Регистрация: 15.09.2024
Сообщений: 5
16.09.2024, 18:53  [ТС]
я в принципе уже решил задачу кое-как с помощью пайтона. мне к сожалению позже надо будет подкрутить нейронку. так что теперь только пайтон.

Добавлено через 2 минуты
мне нужна по сути простая рисовалка векторами, нужно просто обвести пиксельный рисунок векторами и всё. потом уже для диплома подключить нейронку чтобы она этим занималась. может быть в конечном итоге получится даже обводить и более стожные рисунки или даже фото, повышая чёткость изображений не смотря на маштабирование.

Добавлено через 1 минуту
спасибо всем за участие бля годаря вам я смог начать дальше если возникнут сложности, то я задам вопрос в разделе пайтон.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.09.2024, 18:54
Цитата Сообщение от aezakmier Посмотреть сообщение
мне нужна по сути простая рисовалка векторами, нужно просто обвести пиксельный рисунок векторами
Ну это уже похоже на ТЗ )
Удачи.
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,040
17.09.2024, 23:12
На базе какой библиотеки сделать программу для рисования?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2024, 23:12
Помогаю со студенческими работами здесь

Ошибка в битовых сдвигах/битовых масках
Здравствуйте! Написал программу, ориентирующуюся на принцип записи числа по IEEE 754. Требуется вывести сигну, экспоненту и мантису - но...

Программа для обработки матриц
Составить на одном из алгоритмических языков программу, запускается и выдает на экран меню из четырех пунктов (генерация, обработка,...

Программа для создания матриц
Задание прикреплено в файле. Вот что я смог написать, прошу, чем проще, тем лучше. лучше с объяснениями. Заранее спасибо) #include...

Программа-калькулятор для матриц 2 × 2
Создание проекта с использованием компонентов для работы с текстом П22-1-15 Программа-калькулятор для матриц 2 × 2. Пользователю...

Имеется программа для умножения матриц
Каким способом матрицы перемножаются? #include &lt;iostream&gt; using namespace std; int main(){ //Размер матриц: const int N=3; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru