Я пишу C# lib для очень простого распознавания изображения, чтобы использовать его в monodroid
, а также используя zxing
порт на C#. Но после того, как я прочитал байты изображения из файла, я делаю такую вещь, как и в случае сканирования штрих-кода zxing
.Zxing weird image reverse
binaryBitmap = new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(rawRgb, width, height, format)));
Но как-то это обратное изображение по вертикали. Я просто сохраняю binaryBitmap
как растровое изображение в файл по пикселям.
Пожалуйста, помогите мне понять, почему это происходит? Что я делаю не так?
@ Майкл использует Zxing.Net.Мобильный порт, отсюда https://github.com/Redth/ZXing.Net.Mobile. Это очень странно для меня, я использую PlanarYUVLuminanceSource - тогда я получаю такое изображение http://i.imgur.com/OlwqC0I.png, но если я использую RGBLuminanceSource, тогда я получаю полное почти нормальное изображение, см. Пример изображения. так что теперь у меня есть даже два вопроса:
- Почему planar принимает только часть изображения и имеет эффект «слой на слое»? и
- ОК, если я буду использовать RGBLuminanceSource, то почему у него есть некоторая инверсия цветов, я имею в виду, что границы прямоугольников черные, а где-то белые. потому что это настоящий имидж, все они черные?
UPDATE: Вот как я получаю байт из устройства, а также, как вы видите, я установить формат NV21, поэтому он должен быть YUV, нет? Интересно, что я делаю неправильно, что источник RGB работы (в списке изображения в порядке) и PLanarYUV нет: (( BTW, оригинальный байт из предварительного просмотра кадра есть результат и тот же размер файла Любое предложение
public void OnPreviewFrame(byte[] bytes, Android.Hardware.Camera camera)
{
var img = new YuvImage(bytes, ImageFormatType.Nv21, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, null); string _fileName2 = "YUV_BYtes_"+ DateTime.Now.Ticks +".txt";
string pathToFile2 = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, _fileName2);
using (var fileStream = new FileStream(pathToFile2, FileMode.Append, FileAccess.Write, FileShare.None))
{
fileStream.Write(img.GetYuvData(), 0, img.GetYuvData().Length);
}
}
public void SurfaceChanged(ISurfaceHolder holder, global::Android.Graphics.Format format, int width, int height)
{
if (camera == null)
return;
var parameters = camera.GetParameters();
width = parameters.PreviewSize.Width;
height = parameters.PreviewSize.Height;
parameters.PreviewFormat = ImageFormatType.Nv21;
//parameters.PreviewFrameRate = 15;
//this.height = size.height;
//this.width = size.width;
//camera.setParameters(params);
//parameters.PreviewFormat = ImageFormatType.;
camera.SetParameters(parameters);
camera.SetDisplayOrientation(90);
camera.StartPreview();
cameraResolution = new Size(parameters.PreviewSize.Width, parameters.PreviewSize.Height);
AutoFocus();
}
Какой zxing-порт вы используете? Там есть разные. Пожалуйста, напишите код, который вы используете для сохранения binaryBitmap. – Michael
@ Майкл. Я добавил ответ на ваш вопрос, на главный вопрос. Благодаря! –
действительно странное изображение. Я не могу понять, что это должно быть проблемой zxing.net. Другие люди должны иметь такой же опыт в таком случае. Вы пробовали последний источник ZXing.Net.Mobile от github? Можете ли вы дать мне исходное изображение и/или дамп данных изображения rgb? – Michael