Не удалось выделить байты в больших изображениях OpenCV - PullRequest
3 голосов
/ 31 марта 2011

Я обрабатываю очень большие изображения, но получаю исключение, которое сообщает мне "Не удалось выделить 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))

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

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

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

0 голосов
/ 01 апреля 2011

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

...