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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2025, 18:07   #11
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 106
По умолчанию

Код:
  
// License: Public domain.

public class rect_recogn2
{
    public static
        void main( final String args[] )
    {
        final String    image_filename = "frame.bmp";
        java.awt.image.BufferedImage    img = null;
        java.util.Vector< java.awt.Rectangle >  rect_list = new java.util.Vector< java.awt.Rectangle >() ;
        
        
        int       img_rows;
        int       img_cols;
        
        final int       rect_min_size = 5;
            // минимальная ширина или высота прямоугольника
        
        final int       grid_step = (int) java.lang.Math.round( rect_min_size/2.0 );
            // расстояние между точками сетки по вертикали и горизонтали
        
        final int      rect_color = java.awt.Color.white.getRGB();
        
        java.lang.System.out.println( "Нахождение прямоуголников в изображении." );
        try
        {
            img = javax.imageio.ImageIO.read( new java.io.File( image_filename ) );
        }
        catch ( final java.io.IOException ex )
        {
            java.lang.System.err.println( "Ошибка чтения файла с изображением." );
            java.lang.System.exit( 1 );
        }
        if ( img == null )
        {
            java.lang.System.err.println( "Ошибка чтения файла с изображением. Объект пустой." );
            java.lang.System.exit( 1 );
        }
        img_rows = img.getHeight();
        img_cols = img.getWidth();
        java.lang.System.out.println( "Ширина изображения ="+img_cols+" высота="+img_rows+" пикселов." );
        
        
        loop1: for ( int row_ind = grid_step; row_ind < img_rows; row_ind += grid_step )
        {
            //if ( row_ind >=500 ) break loop1;
            loop2: for ( int col_ind = grid_step; col_ind < img_cols; col_ind += grid_step )
            {
                //java.lang.System.out.println( "row="+ row_ind +" col="+ col_ind );
                // Проходим по точкам сетки
                
                // Если цвет точки нужный
                if ( img.getRGB( col_ind, row_ind ) == rect_color )
                {
                    int rect_x, rect_y, rect_w, rect_h;
                    //java.lang.System.out.println( "\tin rectangle" );

                    // Проверка не входит ли точка в уже найденный прямоугольник
                    for ( java.awt.Rectangle r : rect_list )
                    {
                        if ( r.contains( col_ind, row_ind ) || (r.x == col_ind) || (r.y == row_ind) ||
                            ((r.x+r.width)==col_ind) || ((r.y+r.height)==row_ind) )
                        {
                            //java.lang.System.out.println( "\tinside rectangle" );
                            continue loop2;
                        }
                    }

                    // Находим границы прямоугольника
                    // идём влево от точки
                    int trip_point = col_ind;
                    while ( img.getRGB( trip_point, row_ind ) == rect_color )
                    {
                        --trip_point;
                        if ( trip_point <= 0 )
                        {
                            // достигли левого края изображения
                            break;
                        }
                    }
                    //java.lang.System.out.println( "\tleft side is "+(trip_point+1) );
                    rect_x = trip_point+1;

                    // идём вправо от точки
                    trip_point = col_ind;
                    while ( img.getRGB( trip_point, row_ind ) == rect_color )
                    {
                        ++trip_point;
                        if ( trip_point >= img_cols )
                        {
                            // достигли правого края изображения
                            break;
                        }
                    }
                    //java.lang.System.out.println( "\tright side is "+(trip_point-1) );
                    rect_w = (trip_point-1) - rect_x;

                    // идём вверх от точки
                    trip_point = row_ind;
                    while ( img.getRGB( col_ind, trip_point ) == rect_color )
                    {
                        --trip_point;
                        if ( trip_point <= 0 )
                        {
                            // достигли верхнего края изображения
                            break;
                        }
                    }
                    //java.lang.System.out.println( "\ttop side is "+(trip_point+1) );
                    rect_y = trip_point+1;

                    // идём вниз от точки
                    trip_point = row_ind;
                    while ( img.getRGB( col_ind, trip_point ) == rect_color )
                    {
                        ++trip_point;
                        if ( trip_point >= img_rows )
                        {
                            // достигли нижнего края изображения
                            break;
                        }
                    }
                    //java.lang.System.out.println( "\tbottom side is "+(trip_point-1) );
                    rect_h = (trip_point-1) - rect_y;
                    
                    // Если найденный прямоугольник не слишком маленький
                    if ( (rect_w >= rect_min_size) && (rect_h >= rect_min_size) )
                    {
                        java.awt.Rectangle  new_rect = new java.awt.Rectangle( rect_x, rect_y, rect_w, rect_h );
                        java.awt.geom.Area  ar = new java.awt.geom.Area( new_rect );
                        java.awt.Rectangle  r;

                        block2: {
                            // Проверка на закруглённые углы у прямоугольника
                            for ( int r_ind = 0; r_ind < rect_list.size(); ++r_ind )
                            {
                                r = rect_list.elementAt( r_ind );
                                // Если обнаружен прямоугольник с закруглёнными углами
                                if ( ar.intersects( r ) )
                                {
                                    // то объединяем области в один прямоугольник
                                    //java.lang.System.out.println( "\tintersects new rectangle" );
                                    ar.add( new java.awt.geom.Area( r ) );
                                    //java.lang.System.out.println( "\told r="+r );
                                    r = ar.getBounds();
                                    //java.lang.System.out.println( "\tnew r="+r );
                                    rect_list.setElementAt( r, r_ind );
                                    break block2;
                                }
                            }
                            
                            // Проверка цвета в середине прямоугольника
                            if ( img.getRGB( new_rect.x + (int)java.lang.Math.round( new_rect.width/2.0 ),
                                    new_rect.y + (int)java.lang.Math.round( new_rect.height/2.0 ) ) == rect_color )
                            {
                                //java.lang.System.out.println( "\tadd rect "+ new_rect.x +" "+new_rect.y );
                                rect_list.addElement( new_rect );
                            }
                        }
                    }
                }
                
            }
        }
        
        for ( java.awt.Rectangle r : rect_list )
        {
            java.lang.System.out.println( "r= "+r );
        }


    }
}
DeepFlake вне форума Ответить с цитированием
Старый 11.01.2025, 18:10   #12
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 106
По умолчанию

Результаты работы программы такие:
Код:
Нахождение прямоуголников в изображении.
Ширина изображения =1920 высота=1031 пикселов.
r= java.awt.Rectangle[x=9,y=18,width=269,height=66]
r= java.awt.Rectangle[x=1911,y=223,width=6,height=800]
r= java.awt.Rectangle[x=507,y=351,width=19,height=20]
r= java.awt.Rectangle[x=274,y=356,width=28,height=16]
r= java.awt.Rectangle[x=274,y=379,width=80,height=80]
r= java.awt.Rectangle[x=634,y=569,width=19,height=19]
r= java.awt.Rectangle[x=274,y=573,width=28,height=17]
r= java.awt.Rectangle[x=446,y=574,width=134,height=17]
r= java.awt.Rectangle[x=275,y=599,width=78,height=77]
r= java.awt.Rectangle[x=1520,y=725,width=31,height=27]
r= java.awt.Rectangle[x=514,y=756,width=19,height=19]
r= java.awt.Rectangle[x=274,y=761,width=28,height=16]
r= java.awt.Rectangle[x=275,y=784,width=78,height=80]
r= java.awt.Rectangle[x=273,y=867,width=15,height=15]
r= java.awt.Rectangle[x=1424,y=924,width=127,height=27]
r= java.awt.Rectangle[x=675,y=981,width=19,height=19]
r= java.awt.Rectangle[x=274,y=986,width=28,height=16]
r= java.awt.Rectangle[x=445,y=987,width=134,height=16]
r= java.awt.Rectangle[x=275,y=1011,width=78,height=19]
Вложения
Тип файла: zip rect-recogn2.zip (7.3 Кб, 0 просмотров)
DeepFlake вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска c/c++ ytrewqwsd1 Помощь студентам 0 22.05.2022 17:41
Алгоритм поиска Sylar9 Общие вопросы C/C++ 0 03.04.2012 12:38
Нужно найти алгоритм для пересечения отрезка с набором прямоугольников Trinock Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 01.12.2011 14:31
Алгоритм перемешивания данных о координатах 9 прямоугольников, которые находятся в структуре Mehanizator Помощь студентам 15 17.08.2011 19:32