OpenCV 3.1 allocated 660meg while loading 5meg jpeg

asked 2016-04-14 14:00:41 -0500

Sergii gravatar image

updated 2016-04-14 14:34:10 -0500

Hello, Please help. I've got a docker image (Debian 8 64 bit inside) with OpenCV 3.1 and java application using it to load and manipulate images. While running docker on Windows (in Virtual Box) it allocates reasonable amount of RAM while loading images. When running the container on Linux (it is also Debian 8) I've got error:

OpenCV Error: Insufficient memory (Failed to allocate 697811968 bytes) in OutOfMemoryError, file /opencv-3.1.0/modules/core/src/alloc.cpp, line 52 OpenCV Error: Assertion failed (u != 0) in create, file /opencv-3.1.0/modules/co re/src/matrix.cpp, line 424 2016-04-14 18:40:46.615 ERROR 1 --- [-nio-443-exec-8] : cv::Exception: /opencv-3.1.0/modules/core/src/matrix.cpp:424: e rror: (-215) u != 0 in function create

It is 665Megabytes while loading 5 Meg jpeg! What I do there: I load an image and resize it to have thumbnail. What happens? Please help. Thank you.

        final Mat image;

        MatOfByte matOfByte = new MatOfByte(buffer);
        try {
            image = Imgcodecs.imdecode(matOfByte, Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
        } finally {
            matOfByte.release();
            buffer = null;
        }

        try {
            size = new ImageSize(image.size());
            index = getIndex(image);
            faces = objectDetector.detectFaces(metadata, image);
            fileService.createThumbnail(image, photo.getThumbnail(),
                    directoryProperties.getSourceThumbnailSize(), false);
        } finally {
            image.release();
        }

       public void createThumbnail(Mat mat, File thumbnail, int thumbSize, boolean markFolderLine) {
               MatOfInt pageParams = new MatOfInt(Imgcodecs.CV_IMWRITE_JPEG_QUALITY,            directoryProperties.getThumbnailIq());
    try {
        Mat thumb = new Mat();
        try {
            Size size = mat.size();
            double scaleBy = size.width > size.height ? size.width / thumbSize : size.height / thumbSize;

            Size size_ = new Size(size.width / scaleBy, size.height / scaleBy);
            Imgproc.resize(mat, thumb, size_);
            if (markFolderLine) {
                Imgproc.line(thumb, new Point(size_.width / 2, 0),
                        new Point(size_.width / 2, size_.height - 1), new Scalar(200, 200, 200), 1, Imgproc.LINE_AA, 0);
            }
            Imgcodecs.imwrite(thumbnail.getPath(), thumb, pageParams);
        } finally {
            thumb.release();
        }
    } finally {
        pageParams.release();
    }
}
edit retag flag offensive close merge delete

Comments

can you show your code ?

berak gravatar imageberak ( 2016-04-14 14:08:27 -0500 )edit

yes, sure. I added code to the original question.

Sergii gravatar imageSergii ( 2016-04-14 14:32:34 -0500 )edit