Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by unity_8ODfMQymB1K81A · Apr 13, 2018 at 05:57 AM · c#androidaugmented-realityaugmented realityzxing

ARCore for Unity save camera image

Using ARCore for Unity, trying to save Frame.CameraImage.AcquireCameraImageBytes() as image and scanning the image for QR code. But the converted image is not in actual scale and it is repeating, so not able to deduct the QR code correctly.

Here is my code

 void Update()
 {
 using (var image = Frame.CameraImage.AcquireCameraImageBytes())
     {
         if (image.IsAvailable)
         {               
 
             byte[] m_EdgeImage = null;
             Color32[] pixels = null;
             IParser Parser = new ZXingParser();
             if (_texture == null || m_EdgeImage == null || _texture.width != image.Width || _texture.height != image.Height)
             {
                 _texture = new Texture2D(image.Width, image.Height, TextureFormat.RGBA32, false, false);                    
                 m_EdgeImage = new byte[image.Width * image.Height*4];           
 
             }
             System.Runtime.InteropServices.Marshal.Copy(image.Y, m_EdgeImage, 0, image.Width * image.Height);               
             _texture.LoadRawTextureData(m_EdgeImage);
             _texture.Apply();       
 
             ParserResult Result = Parser.Decode(pixels, _texture.width, _texture.height);
             if (Result != null)
             {
                 Debug.Log("QRCODE");
 
             }
             else
             {               
                 var encodedJpg = _texture.EncodeToJPG();
                 var path = Application.persistentDataPath;
                 File.WriteAllBytes(path + "/test.jpg", encodedJpg);             
                 Debug.Log("NOQRCODE");
                 Application.Quit();
             }
         }
     }
 }


Here is the converted image

alt text

What is wrong here and why the image is repeating

77cg6.jpg (8.7 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Timothy_King · Dec 18, 2018 at 12:07 AM

You've probably figured this out by now but I thought I'd answer this to help anyone who stumbles across this.

 

You don't actually have to convert the CameraImageBytes into a Texture2D to scan for barcodes - you can use a byte[] instead.

 

I've also spun off a Task to do the image acquisition in this example to avoid the frame stutter you get from getting the camera data on the main thread.

  

Because of this, the callback should avoid using the Unity APIs.

 

To pass control back to the main thread while performing your desired action you can start a coroutine inside of the callback - this will then be executed on the main Unity thread.

 

Be aware that you would probably want to modify this example to not overlap tasks (there is no guarantee that the task will be done in the 0.5 second interval I've set here), and could perhaps look into using Unity Jobs for the multi-threading.

 

 using System;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using BarcodeScanner;
 using BarcodeScanner.Parser;
 using GoogleARCore;
 using UnityEngine;
 using ZXing;
 
 namespace AndroidQRCodeScanExample
 {
     class ExampleClass : MonoBehaviour
     {
         private ZXingParser Parser { get; set; }
 
         /// <summary>
         ///  Set up the ZXingParser and set up our scanner to invoke every 0.5 seconds
         /// </summary>
         void Start()
         {
             var scannerSettings = new ScannerSettings();
             Parser = new ZXingParser(scannerSettings);
 
             InvokeRepeating("Scan", 0, 0.5f);
         }
 
         /// <summary>
         /// Capture and scan the current frame 
         /// </summary>
         void Scan()
         {
             Action<byte[], int, int> callback = (bytes, width, height) =>
             {
                 if (bytes == null)
                 {
                     // No image is available.
                     return;
                 }
 
                 // Decode the image using ZXing parser
                 var result = Parser.Scanner.Decode(bytes, width, height, RGBLuminanceSource.BitmapFormat.Gray8);
                 var resultText = result.Text;
 
                 // Do whatever you would like with the result here
                 StartCoroutine(DoSomethingWithThisInformation());
             };
 
             CaptureScreenAsync(callback);
         }
 
         /// <summary>
         /// Capture the screen using CameraImage.AcquireCameraImageBytes.
         /// </summary>
         /// <param name="callback"></param>
         void CaptureScreenAsync(Action<byte[], int, int> callback)
         {
             Task.Run(() =>
             {
                 byte[] imageByteArray = null;
                 int width;
                 int height;
 
                 using (var imageBytes = Frame.CameraImage.AcquireCameraImageBytes())
                 {
                     if (!imageBytes.IsAvailable)
                     {
                         callback(null, 0, 0);
                         return;
                     }
 
                     int bufferSize = imageBytes.YRowStride * imageBytes.Height;
 
                     imageByteArray = new byte[bufferSize];
 
                     Marshal.Copy(imageBytes.Y, imageByteArray, 0, bufferSize);
 
                     width = imageBytes.Width;
                     height = imageBytes.Height;
                 }
 
                 callback(imageByteArray, width, height);
             });
         }        
     }
 }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

523 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Intent Android studio class to imported Unity class(Android Class A,Button1 - Unity Scene A, Android Class A,Button2 - Unity Scene b ) 0 Answers

How can i get the name of the current prefab from the list.. 1 Answer

Switching from AR scene to normal unity scene crash using android 0 Answers

AR Foundation device camera flickering 0 Answers

Multiple Cars not working 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges