Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2014, 13:45   #1
kurosaki_kun
Новичок
Джуниор
 
Регистрация: 13.12.2013
Сообщений: 2
Восклицание Фильтр Гаусса,обработка изображения с помощью процессов и потоков

Доброго времени суток, уважаемые программисты! Есть проблемка...дано изображение, которое будет обрабатываться фильтром Гаусса, код обработки есть,все прекрасно работает, НО, препод для проверки дает картинку 20000x20000 пикселей, и естественно моим проходом это будет обрабатываться очень долго...и он сказал,что если поделить картинку на несколько частей и обработать с помощью процессов и потоков, то все должно пройти немного быстрее...в связи с этим,прошу помощи у тех,кто сталкивался с подобной проблемой или может помочь с изменением кода... Код программы выкладываю для проверки работоспособности и внесения возможных поправок. Реализация программы в QT Creator 5.
Вложения
Тип файла: zip lab2.zip (2.5 Кб, 24 просмотров)
kurosaki_kun вне форума Ответить с цитированием
Старый 19.12.2014, 16:31   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

1. Ты выложил не весь код, т.к. часть кода ты генерировал автоматически через Qt designer. Проект не собирается.
2. Твой код настолько жесток, что править его никто не будет. Проще удалить его и написать новый.

По проблеме:
1) у тебя должна быть функция, которая на вход принимает картинку и возвращает обработанную фильтром. Это ведь так логично, не правда ли?
2) неужели ты не можешь нарезать картинку на части, передать части в функцию фильтра и слепить назад результаты? - это же очень просто.
3) ты нарезал картинку на более мелкие и сложил их в массив. Распараллелить обработку очень просто, ты можешь использовать для этого как QThread, так и QtConcurrent (я бы взял последний вариант - проблема решается в одну строчку).

Соответственно, твоя проблема возникла из за того, что ты написал хреновый код - у тебя нет функции которая применяет фильтр Гаусса к изображению, ты все слепил в один "божественный объект". Ну а хреново организованный код распараллелить не выйдет.

Вобщем все надо переписывать с начала .
rrrFer вне форума Ответить с цитированием
Старый 19.12.2014, 17:02   #3
kurosaki_kun
Новичок
Джуниор
 
Регистрация: 13.12.2013
Сообщений: 2
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
1. Ты выложил не весь код, т.к. часть кода ты генерировал автоматически через Qt designer. Проект не собирается.
2. Твой код настолько жесток, что править его никто не будет. Проще удалить его и написать новый.

По проблеме:
1) у тебя должна быть функция, которая на вход принимает картинку и возвращает обработанную фильтром. Это ведь так логично, не правда ли?
2) неужели ты не можешь нарезать картинку на части, передать части в функцию фильтра и слепить назад результаты? - это же очень просто.
3) ты нарезал картинку на более мелкие и сложил их в массив. Распараллелить обработку очень просто, ты можешь использовать для этого как QThread, так и QtConcurrent (я бы взял последний вариант - проблема решается в одну строчку).

Соответственно, твоя проблема возникла из за того, что ты написал хреновый код - у тебя нет функции которая применяет фильтр Гаусса к изображению, ты все слепил в один "божественный объект". Ну а хреново организованный код распараллелить не выйдет.

Вобщем все надо переписывать с начала .
Ну,видимо у вас глаза выпали от хреново написанного кода,что вы там не увидели фильтр Гаусса..) Извините конечно,но я не профессионал этого дела,я просто спросил,как правильно нарезать картинку и распараллелить ее по разным процессам,только и всего) Выложу весь проект,чтобы вы посмотрели,что не так)
В моем коде я загружаю картинку, копирую ее во временный массив, обрабатываю функцией gauss_filter,и потом сохраняю) запуск производится с консоли с передачей параметров размера ядра и коэффициентом размытия)
Вложения
Тип файла: zip lab2.zip (3.6 Кб, 29 просмотров)

Последний раз редактировалось kurosaki_kun; 19.12.2014 в 17:04.
kurosaki_kun вне форума Ответить с цитированием
Старый 19.12.2014, 18:08   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Ну,видимо у вас глаза выпали от хреново написанного кода,что вы там не увидели фильтр Гаусса..)
Я увидел там фильтр гаусса в классе MainWindow. Картинка - это тоже часть mainwindow.
Соответственно если ты решишь использовать свой код для параллельной обработки нескольких картинок -тебе надо будет создать несколько mainwindow (по одному для каждой части картинки).

Т.е. твой код фильтр гауса нифига не пригоден для повторного использования, не получится просто так взять и распараллелить его. Тебе надо либо внимательно прочитать предыдущий ответ, либо ты можешь говнокодить дальше и, например, уже внутри функции фильтрации заниматься созданием потоков и разделением картинок. Но это путь вникуда

Цитата:
запуск производится с консоли с передачей параметров размера ядра и коэффициентом размытия)
Если запуск с консоли, то ui файлы зачем? - че не мог в Qt designer кинуть едитбокс для ввода коэффициента размытия?

Цитата:
просто спросил,как правильно нарезать картинку
дак встроенной функций QPixmap::copy, в чем проблема то?
Нужен пример - держи:
Код:
QPixmap frames(filename);
  const int frameWidth = frames.width() / nFrames,
            frameHeight = frames.height();

  for (int i = 0; i < nFrames; ++i)
    m_animations[name].push_back(
      new QPixmap(
        frames.copy(i*frameWidth, 0, frameWidth, frameHeight)
        .scaled(weight, height, Qt::IgnoreAspectRatio, Qt::FastTransformation)
      )
    );
Так я нарезал картинку с кадрами анимации. scaled тебе не нужно только, пожалуй. В остальном ты можешь использовать этот код

Цитата:
просто спросил,как правильно .... и распараллелить ее по разным процессам
Потокам или процессам?

Я выше написал более чем подробно как это можно делать. Наверняка можно сделать и иначе - например в том варианте, что предложил я - создаются копии для каждой части картинки, а это может быть тоже долго. Как Более оптимальный вариант - не создавать копии, а указывать каждой функции фильтрации область картинки, которую надо обработать. Но в этом случае вам не надо нарезать картинку, а вы спрашиваете про это.

Вообще, насколько ты думаешь поднимется скорость работы программы после распараллеливания?
Цитата:
и естественно моим проходом это будет обрабатываться очень долго
Вот из этой фразы мне кажется что ты ждешь чуда какого-то от распаралелливания. А его не будет.
rrrFer вне форума Ответить с цитированием
Старый 19.12.2014, 18:13   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Кстати, вот тут описан параллельный фильтр Гаусса: http://habrahabr.ru/company/epam_systems/blog/245523/

Я не вникал в статью, но они там явно решили все проблемы.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список запущенных процессов и потоков REztor C# (си шарп) 0 08.09.2014 14:20
Монитор процессов, потоков и окон р е ш и т е NightWish Помощь студентам 3 17.03.2011 12:18
О приоритетах потоков и процессов Altera Свободное общение 9 01.05.2010 10:41
Обработка изображения (инверсный фильтр) Dreablin C++ Builder 5 06.12.2009 22:28
монитор процессов и потоков на делфи Танка Помощь студентам 1 29.05.2009 16:41