Как сделать reinterpret_cast в java, чтобы получить массив пикселей

Я хочу преобразовать следующий код в язык Java. однако я не могу найти способ выполнить reinterpret_cast в java. пожалуйста, помогите мне.

char *pixels= reinterpret_cast<char*>(FinalImage.data);

программа может быть показана следующим образом. Я хочу обнаружить размытое изображение.

Mat newEx=new Mat();
            final int MEDIAN_BLUR_FILTER_SIZE=15;
            Imgproc.medianBlur(mat1, newEx, MEDIAN_BLUR_FILTER_SIZE);

            Mat LaplacianImage= new Mat();
            Imgproc.Laplacian(newEx, LaplacianImage,CvType.CV_8U);

            Mat LaplacianImage8Bit=new Mat();
            LaplacianImage8Bit.convertTo(LaplacianImage8Bit,CvType.CV_8UC1);
            Mat FinalImage=new Mat();
            Imgproc.cvtColor(LaplacianImage8Bit,FinalImage,Imgproc.COLOR_BGR2BGRA);

            int rows= FinalImage.rows();
            int cols= FinalImage.cols();

            char *pixels= reinterpret_cast<char*>(FinalImage.data);

person Krishan Kavinda    schedule 24.03.2016    source источник
comment
Насколько мне известно, в Java нет эквивалента. Кастинг разрешен только между совместимыми типами. Вместо того, чтобы размещать код C++ и запрашивать прямой перевод; пожалуйста, опубликуйте Java, который у вас есть, и объясните, где вы застряли - почти невозможно перевести произвольный, идиоматический код с одного языка на другой...   -  person Boris the Spider    schedule 24.03.2016
comment
Если я правильно понимаю, вы пытаетесь преобразовать изображение в массив символов? Может быть, попробовать что-то вроде этого? Строка imageDataString = Base64.encodeBase64URLSafeString (imageByteArray)   -  person Manuel S.    schedule 24.03.2016
comment
Опубликуйте свой код Java и опишите, что вы пытаетесь сделать. Как преобразовать byte[] в строку с кодировкой Base64?   -  person tak3shi    schedule 24.03.2016
comment
Какой класс Mat вы используете здесь? Будет ли это org.opencv.core.Mat?   -  person Serge Ballesta    schedule 24.03.2016


Ответы (2)


Насколько я понимаю, у вас есть объект FinalImage.data, и вы хотите преобразовать данные, хранящиеся в этом объекте, в строку.

Это именно то, что делает интерфейс Serializable. Итак, если ваш объект FinalImage.data наследует этот код, вы можете использовать что-то вроде этого:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(FinalImage.data);
String pixels = baos.toString();
oos.close();
person Jonathan Mee    schedule 24.03.2016

Java является языком более высокого уровня, чем C или C++, и не имеет прямого способа обрабатывать зону памяти как массив символов.

Но здесь вы используете классы OpenCV, а библиотека Java OpenCV предлагает некоторые инструменты, потому что она знает, что матрица байтов находится внутри массива байтов. И то же самое для обычных размеров элементов.

К сожалению, я недостаточно привык к opencv, чтобы угадать, каков внутренний тип FinalImage, но я думаю, что это должен быть MatOfByte, поскольку вы используете типы CV_8U и CV_8UC1. Если это так, вы можете попробовать это:

MatOfByte byteMat = (MatOfByte) FinalImage;
byte[] internalBytes = byteMat.toArray();
person Serge Ballesta    schedule 24.03.2016