Не удалось выделить байты в больших изображениях OpenCV

Я обрабатываю очень большие изображения, но получаю исключение, которое сообщает мне «Не удалось выделить 991623040 байт».

У меня 64-битная Win7 и 8 ГБ оперативной памяти. Разве это не смехотворно, если размер меньше 1 ГБ?

Как я могу решить эту проблему?

public bresenhamCircle()
    {
        if (path != null) //path is a string represents the file path
        {
            using (IplImage orgImg = new IplImage(rc.imgeYolu, LoadMode.GrayScale))
            {
                if (rc.sekizBit)
                {
                    orgImg.ToBitmap();
                }
                else
                {
                    //binary image
                }

                using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1))
                {
                    using (CvBlobs blobs = new CvBlobs())
                    {


                        uint result = blobs.Label(orgImg, imgLabel);
                        blobs.FilterByArea(10, 130);
                    }
                }


            }
        }
        else
        {
            throw new Exception("smtg..");
        }

    }

Я получаю сообщение об ошибке в этой строке: using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1))


person cerezza    schedule 31.03.2011    source источник
comment
Давайте посмотрим ваш код, который сгенерировал эту ошибку. Также обратите внимание, какую версию opencv вы используете.   -  person rossb83    schedule 01.04.2011
comment
using (IplImage imgLabel = new IplImage(orgImg.Size, BitDepth.F32, 1)) эта строка генерирует ошибку. Размер orgImage составляет 18000x13000, и он определяется из файла с помощью кода: IplImage orgImg = new IplImage (путь, LoadMode.GrayScale) Версия OpenCV 2.2   -  person cerezza    schedule 01.04.2011
comment
отредактируйте свой исходный пост и поместите код в блок кода.   -  person Scott Chamberlain    schedule 01.04.2011


Ответы (2)


Это может быть несколько причин; скорее всего из-за утечек памяти. Нам нужно увидеть ваш код, приведенный выше код выглядит так, как будто вы не объявляете изображения в указателях с помощью оператора «*», но это, вероятно, опечатка. Также только потому, что у вас 64-битные окна и 8 ГБ ОЗУ, если вы используете 32-разрядную сборку opencv, у вас есть доступ только к 2 ГБ ОЗУ. Я бы порекомендовал загрузить последнюю версию SVN opencv и построить в 64-битном режиме и включить tbb.

person rossb83    schedule 01.04.2011
comment
Обратите внимание, что opencv 2.2 страдает от множества проблем, возможно, вам лучше использовать opencv 2.1. При этом в последней версии svn должно быть исправлено большинство проблем версии 2.2. - person rossb83; 01.04.2011

Если вы не запускаете приложение в 64-битном режиме, значит, вы не используете 8 ГБ ОЗУ. Также нехватка памяти вызвана недостаточным количеством смежных виртуальных адресных пространств, а не физических адресных пространств. ="nofollow">http://vpnchoudhary.blogspot.com/2011/03/out-of-memory-exception-simple.html для получения подробной информации о том, как управлять памятью 32-битного приложения.

Сначала проверьте, работает ли ваше приложение в 64 или нет. Откройте диспетчер задач и посмотрите, добавлено ли к вашему приложению *32 в конце. если да, то ваше приложение работает в 32-битном режиме. Скомпилируйте приложение для 64-битной версии. это должно решить вашу проблему. Если ваше приложение уже работает в 64-разрядной версии, значит, в вашем приложении происходит утечка памяти, но я очень сомневаюсь в этом, поскольку вы используете «использование», которое должно позаботиться об удалении объекта. Кроме того, с 64-битным приложением вы получаете огромные виртуальные адресные пространства, которые трудно исчерпать, ваше приложение начнет работать (очень медленно), но редко выходит из памяти.

person Vipin Kumar    schedule 03.04.2011