Хорошо, у меня все получилось:
Mat mat = new Mat(height, width, CvType.CV_8UC4);
byte[] matrix = source.getMatrix();
byte[] temp = new byte[width * height * 4];
int i = 0;
mat.get(0, 0, temp);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
byte luminance = matrix[y * width + x];
temp[i++] = luminance;
temp[i++] = luminance;
temp[i++] = luminance;
temp[i++] = (byte)255;
}
}
mat.put(0, 0, temp);
Vector<Marker> markers = new Vector<>();
mMarkerDetector.detect(mat, result, mCameraParameters, Constants.ARUCO_MARKER_SIZE, null);
Если вы измените MarkerDetector
, чтобы пропустить Imgproc.cvtColor
и используете in
вместо grey
, вы можете вместо этого сделать:
Mat mat = new Mat(height, width, CvType.CV_8UC1);
byte[] matrix = source.getMatrix();
byte[] temp = new byte[width * height];
int i = 0;
mat.get(0, 0, temp);
System.arraycopy(matrix, 0, temp, 0, width * height);
mat.put(0, 0, temp);
Vector<Marker> markers = new Vector<>();
mMarkerDetector.detect(mat, result, mCameraParameters, Constants.ARUCO_MARKER_SIZE, null);
Дополнительное примечание - я не провел достаточного тестирования, чтобы быть уверенным, но, похоже, если вы повторно используете mMarkerDetector
, обнаружение постепенно прогрессирует со временем, но создание нового каждый раз остается сравнительно быстрым.
Кроме того, обратите внимание на то, что у меня изначально поменялись размеры матрицы - похоже, это не повлияло на мой исходный код, но произошло, как только я загрузил необработанные массивы.
(Обратите внимание, что весь этот код был несколько изменен при передаче между моей IDE и моим браузером - хотя он ДОЛЖЕН работать.)