Kamera Frame manipulieren ...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kamera Frame manipulieren ...

    Hallo Zusammen,

    ich versuche gerade eine Videoaufnahme einer USB Kamera mit weiteren Information zu belegen.
    Leider erscheinen diese Informationen nicht im Bild.

    Da ich neu in dem Gebiet bin, vermute ich einen Fehler in meiner Routine

    Quellcode

    1. public void onFrame(final ByteBuffer frame) {
    2. frame.clear();
    3. synchronized (bitmap) {
    4. bitmap.copyPixelsFromBuffer(frame);
    5. Canvas c = new Canvas(bitmap);
    6. Paint p = new Paint();
    7. // text color - #3D3D3D
    8. p.setColor(Color.rgb(61, 61, 61));
    9. // text size in pixels
    10. // p.setTextSize((int) (14 * scale));
    11. p.setTextSize((int) (14 * 10));
    12. // text shadow
    13. p.setShadowLayer(1f, 0f, 1f, Color.WHITE);
    14. c.drawText("Hello Nobody", 30, 210, p);
    15. ByteArrayOutputStream stream = new ByteArrayOutputStream();
    16. bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    17. frame.get(stream.toByteArray(), 0, stream.toByteArray().length);
    18. }
    19. }
    Alles anzeigen

    Laut Dok. wird der Frame als reiner Pixelbuffer übergeben.
    Ich möchte nun Texte in den Buffer einpflegen. Vielleicht gibt es ja bessere und schneller Methoden.
    Ich bin da offen für Anregungen.
    Jedenfalls erscheint der Text "Hello Nobody" nicht im Bild.

    Das Bild sieht aber auch nicht verunstaltet aus.

    Ideen ?

    Viele Grüße
    R.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ritchie () aus folgendem Grund: Code Fehler entfernt

  • Hallo Ritchie,
    Also ich würde sagen da deine frame Variable final ist kannst du nichts neues in ihr speichern.
    Eine final Variable kann nach der Initialisierung nicht mehr verändert werden.
    Somit ist dein frame.clear() schon sinnlos und wird nicht ausgeführt.

    Schaue dir an was final in Java bedeutet.

    Ps. welche Dokumentation meinst du?
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • da bin ich mir nicht sicher.
    Deshalb wollte ich die doku. wissen.

    Ich denke hier müsste es put und nicht get heißen.
    frame.get(stream.toByteArray(), 0, stream.toByteArray().length);

    Ps für mich sieht das alles komisch mit deinen streams aus wo schreibst du da was rein?
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Hi,

    das ganze ist in diesem Projekt,
    und hier github.com/saki4510t/UVCCamera…tmap_using_iframecallback
    wurde die Manipulation des Frames mit dem Abspeichern in
    einer Bitmap beschrieben.
    Der eigentliche Frame wurde hier von jemanden erklärt.
    github.com/saki4510t/UVCCamera/issues/337


    Die Sache mit dem .put im Frame ist auch richtig.



    Scheinbar wird der Frame aber gar nicht manipuliert, da auch auch einfach mal nur
    Frame.Clear(); habe im Code stehen lassen.

    Das würde ja leeren Bildschirm bedeuten. Es passiert aber nichts.

    Ich muss dazu sagen, dieses Thema ist komplett neu für mich.

    Weitere Aufrufe Infos der Aufrufe:

    Quellcode

    1. public void setFrameCallback(final IFrameCallback callback, final int pixelFormat) {
    2. if (mNativePtr != 0) {
    3. nativeSetFrameCallback(mNativePtr, callback, pixelFormat);
    4. }
    5. }
    6. private static final native int nativeSetFrameCallback(final long mNativePtr, final IFrameCallback callback, final int pixelFormat);
    7. public interface IFrameCallback {
    8. /**
    9. * This method is called from native library via JNI on the same thread as UVCCamera#startCapture.
    10. * You can use both UVCCamera#startCapture and #setFrameCallback
    11. * but it is better to use either for better performance.
    12. * You can also pass pixel format type to UVCCamera#setFrameCallback for this method.
    13. * Some frames may drops if this method takes a time.
    14. * When you use some color format like NV21, this library never execute color space conversion,
    15. * just execute pixel format conversion. If you want to get same result as on screen, please try to
    16. * consider to get images via texture(SurfaceTexture) and read pixel buffer from it using OpenGL|ES2/3
    17. * instead of using IFrameCallback(this way is much efficient in most case than using IFrameCallback).
    18. * @param frame this is direct ByteBuffer from JNI layer and you should handle it's byte order and limitation.
    19. */
    20. public void onFrame(ByteBuffer frame);
    21. }
    Alles anzeigen

    Endziel wäre das "https://github.com/saki4510t/OpenCVwithUVC". Aber vorher sollte ich den "Spass" hier im Griff haben.

    Viele Grüße
    R.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Ritchie () aus folgendem Grund: Erklärung eingefügt

  • Hallo
    Ich kann dir da hier nicht viel helfen da ich mich damit zu wenig auskenne.

    Hierzu github.com/saki4510t/UVCCamera/issues/337
    Deine Funktion ist aber sehr verändert glaube nicht das es so geht. Wenn dann müsste dein Code bei „// some operation“ rein also dort müsstest du den Buffer das Frame bearbeiten. Wenn das was er da gepostet hat überhaupt richtig ist.

    github.com/saki4510t/UVCCamera…tmap_using_iframecallback
    Da müsstest du meiner Meinung nach in der run() Methode arbeiten.

    Java-Quellcode

    1. private final Bitmap bitmap = Bitmap.createBitmap(UVCCamera.DEFAULT_PREVIEW_WIDTH, UVCCamera.DEFAULT_PREVIEW_HEIGHT, Bitmap.Config.RGB_565);
    2. ...
    3. private final IFrameCallback mIFrameCallback = new IFrameCallback() {
    4. @Override
    5. public void onFrame(final ByteBuffer frame) {
    6. frame.clear();
    7. synchronized (bitmap) {
    8. bitmap.copyPixelsFromBuffer(frame);
    9. }
    10. mImageView.post(mUpdateImageTask); // this is just for showing result
    11. }
    12. };
    13. private final Runnable mUpdateImageTask = new Runnable() {
    14. @Override
    15. public void run() {
    16. synchronized (bitmap) {
    17. Canvas c = new Canvas();
    18. c.setBitmap(bitmap);
    19. Paint p = new Paint();
    20. // text color - #3D3D3D
    21. p.setColor(Color.rgb(61, 61, 61));
    22. // text size in pixels
    23. // p.setTextSize((int) (14 * scale));
    24. p.setTextSize((int) (14 * 10));
    25. // text shadow
    26. p.setShadowLayer(1f, 0f, 1f, Color.WHITE);
    27. c.drawText("Hello Nobody", 30, 210, p);
    28. mImageView.setImageBitmap(bitmap);
    29. }
    30. }
    31. };
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()