2013-06-06 4 views
0

Я пишу 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, тогда я получаю полное почти нормальное изображение, см. Пример изображения. так что теперь у меня есть даже два вопроса:

  1. Почему planar принимает только часть изображения и имеет эффект «слой на слое»? и
  2. ОК, если я буду использовать 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(); 
    } 
+1

Какой zxing-порт вы используете? Там есть разные. Пожалуйста, напишите код, который вы используете для сохранения binaryBitmap. – Michael

+0

@ Майкл. Я добавил ответ на ваш вопрос, на главный вопрос. Благодаря! –

+0

действительно странное изображение. Я не могу понять, что это должно быть проблемой zxing.net. Другие люди должны иметь такой же опыт в таком случае. Вы пробовали последний источник ZXing.Net.Mobile от github? Можете ли вы дать мне исходное изображение и/или дамп данных изображения rgb? – Michael

ответ

0
.?

Я думаю, что знаю, что вы сделали. Данные выглядят как растровые данные RGB565 (или что-то подобное). Вы не можете поместить такой массив байтов в PlanarYUVLuminanceSource. Вы должны убедиться, что массив байтов, который вы используете с Если вы используете следующий фрагмент кода

new RGBLuminanceSource(rawRgb, width, height, format) 
Правила поведения: легко и просто:

убедитесь, что значение формата соответствует макете и данным параметра rawRgb. , если вы используете что-нибудь glike следующие

new PlanarYUVLuminanceSource(yuvBytes, 640, 960, 0, 0, 640, 960, false); 

убедитесь, что yuvBytes содержит только реальные данные YUV. Я могу дать только лучший ответ, если вы разместите более полный образец кода.

+0

У меня есть вопрос с обновлением с большим количеством кода –

+0

Какова ширина и высота изображения предварительного просмотра ? – Michael

+0

спасибо за вашу помощь, но проблема была в fu ... device :(НО камера работает нормально, странно. Потому что я пробовал на другом устройстве и все в порядке. –