Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение границ изображения. Куда прописать код? 
:(
    Опции темы
zzdxw
Дата 6.10.2014, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



Здравствуйте!
У меня есть программа для просмотра изображений. Нужно сделать, чтобы была возможность выделять границы (контуры) просматриваемого изображения (методом Собеля/Канни). Код для этой задачи я нашел. Но не знаю, куда его вписать, постоянно выдает ошибки. Прилагаю найденный код и исходники программы.
Помогите разобраться, пожалуйста!

Код

#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
Graphics::TBitmap *Sobel(Graphics::TBitmap *image);
int _tmain(int argc, _TCHAR* argv[])
{
    Graphics::TBitmap *img = new Graphics::TBitmap;
    img->LoadFromFile("1.bmp");
    Sobel(img)->SaveToFile("2.bmp");
    return 0;
}
 
Graphics::TBitmap *Sobel(Graphics::TBitmap *img) {
    Graphics::TBitmap *returnImage = new Graphics::TBitmap;
    returnImage->SetSize(img->Width, img->Height);
    returnImage->PixelFormat = pf24bit;
    Byte *ptr, *ptrup, *ptrdown, *ptrres, *ptrcur;
    int sumX = 0, sumY = 0;
    short SUM = 0;
 
    int GX[3][3]={{-1, 0, 1},
                 {-2, 0, 2},
                 {-1, 0, 1}};
 
    int GY[3][3]={{ 1, 2, 1},
                 { 0, 0, 0},
                 {-1,-2,-1}};
 
    for (int Y = 1; Y < img->Height - 1; Y++) {
        ptrres = (Byte*)returnImage->ScanLine[Y];
        ptr = (Byte*)img->ScanLine[Y];
        ptrup = (Byte*)img->ScanLine[Y - 1];
        ptrdown = (Byte*)img->ScanLine[Y + 1];
        for (int X = 0; X < 3 * img->Width; X += 3) {
            if (Y - 1 == 0 || Y + 1 == img->Height - 1) SUM = 0;
            else if (X == 0 || X == img->Width - 3) SUM = 0;
            else {
                sumX = 0;
                sumY = 0;
                for (int I = -1; I <= 1; I++) {
                    for (int J = -1; J <= 1; J++) {
                        switch(I) {
                        case -1:ptrcur = ptrup; break;
                        case 0:ptrcur = ptr; break;
                        case 1:ptrcur = ptrdown; break;
                        }
                        int piX = 3 * J + X;
                        int NC = 0.299 * ptrcur[piX + 2] + 0.587 * ptrcur
                            [piX + 1] + 0.114 * ptrcur[piX];
                        sumX = sumX + NC * GX[I + 1][J + 1];
                        sumY = sumY + NC * GY[I + 1][J + 1];
                    }
                }
                SUM = abs(sumX) + abs(sumY);
                if (SUM > 255) SUM = 255;
                if (SUM < 0) SUM = 0;
            }
            SUM = 255 - abs(SUM);
            ptrres[X + 2] = SUM;
            ptrres[X + 1] = SUM;
            ptrres[X] = SUM;
        }
    }
    return returnImage;
}



Это сообщение отредактировал(а) zzdxw - 6.10.2014, 12:31

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  1.rar 724,21 Kb
PM MAIL   Вверх
xvr
Дата 7.10.2014, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(zzdxw @  6.10.2014,  12:30 Найти цитируемый пост)
постоянно выдает ошибки.

Какие именно ошибки? Программа выглядит рабочей, по крайней мере явных ляпов нет.

Добавлено через 2 минуты и 4 секунды
PS. BCB может не понравится _tmain и _TCHAR, сделайте просто main и char


PM MAIL   Вверх
zzdxw
Дата 7.10.2014, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



Не могу реализовать этот код в моей программе. 
Если его вставить (например в кнопку в MainMenu), то выдает ошибки типа, undefined symbol 'img' (17 строчка), 'setsize' is not a member of Tbitmap (17), unreachable code (17), cannot return a value (12, 66). Не могу понять, что ей не нравится...

Это сообщение отредактировал(а) zzdxw - 7.10.2014, 12:16
PM MAIL   Вверх
xvr
Дата 7.10.2014, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Вы должны вставить к себе целиком процедуру Sobel (с 15й строки и до конца файла), и не в "кнопку в MainMenu", а на глобальном уровне (между процедурами).  А в "кнопке в MainMenu" просто ее вызвать

PM MAIL   Вверх
zzdxw
Дата 9.10.2014, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



В общем, я сделал. Но фильтр работает некорректно smile  smile 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  sobel.rar 727,63 Kb
PM MAIL   Вверх
xvr
Дата 9.10.2014, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(zzdxw @  9.10.2014,  12:01 Найти цитируемый пост)
Но фильтр работает некорректно

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

PM MAIL   Вверх
zzdxw
Дата 10.10.2014, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.10.2014

Репутация: нет
Всего: нет



То есть надо сделать, чтобы результат выводился, например, в Image2?..
PM MAIL   Вверх
xvr
Дата 10.10.2014, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Да

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.