نظرًا لأننا نعمل حاليًا على بعض عناصر الواقع المعززة لنظام التشغيل Android ، فأنا بحاجة إلى عرض صورة الكاميرا باستخدام برنامج OpenGL ES. إنه يعمل بشكل رائع مع Java الخالص إذا كان أحد يستخدم الصورة الرمادية فقط. توفر كاميرا G1 s الصورة بتنسيق YUV بينما لا يفهم OpenGL إلا صور RGB. لسوء الحظ ، فإنه من غير الممكن تحويل صورة YUV إلى RGB في Java الخالص للصور ذات 480 320 بكسل. الفراغ toRGB565 (yuvs * قصيرة غير الموقعة ، int العرض في ، ارتفاع intInIn ، غير الموقعة int * rgbs ، int widthOut ، int heightOut) {int half_widthIn = widthIn >> 1؛ // end of the luminance data int lumEnd = (widthIn * heightIn) >> 1؛ // تشير إلى زوج قيمة النصوع التالي int lumPtr = 0؛ // points to the next chromiance value pair int chrPtr = lumEnd؛ / / نهاية سطر الباحثين الحاليين لخطوط الإنصاف EndEnd = half_widthIn؛ int x، y؛ لـ (y = 0؛ y> 1 ؛ لـ (x = 0؛ x> 8) & 0xff؛ Y1 = Y1 & 0xff؛ int Cr = yuvs؛ int Cb = ((Cr >> 8) & 0xff) - 128؛ Cr = (Cr & 0xff) - 128؛ int R، G، B؛ // generate first RGB components B = Y1 + ((454 * Cb) >> 8)؛ if (B 255) B = 255؛ G = Y1 - ((88 * Cb + 183 * Cr) >> 8) ؛ إذا كانت (G 255) G = 255 ؛ R = Y1 + ((359 * Cr) >> 8) ؛ إذا (R 255) R = 255 ؛ int val = ((R & 0xf8)> 3) ؛ // إنشاء مكونات RGB ثانية B = Y1 + ((454 * Cb) >> 8) ؛ إذا كانت (B 255) B = 255 ؛ G = Y1 - ((88 * Cb + 183 * Cr) >> 8) ؛ إذا كانت (G 255) G = 255 ؛ R = Y1 + ((359 * Cr) >> 8) ؛ إذا (R 255) R = 255 ؛ rgbs = val | (( ((R & 0xf8)> 3))> 1) / half_widthIn) * half_widthIn؛ lineEnd + = half_widthIn؛ }} الرمز غير محسّن في الوقت الحالي ولكن يمكنه معالجة صورة بحجم 320 320 في ~ 25 مللي ثانية على G1 الخاص بي (وهو أمر بطيء إلى حد ما وفقًا لتعليقات الطلاب). من أجل استدعاء هذه الوظيفة من Java ، احتجت إلى غلاف مع توقيع JNI: / ** * تحويل صورة الإدخال من YUV إلى صورة RGB 5_6_5. * يجب أن يكون حجم المخزن المؤقت للإخراج على الأقل حجم صورة الإدخال. * / JNIEXPORT void JNICALL Java_de_offis_magic_core_NativeWrapper_image2TextureColor (JNIEnv * env، jclass clazz، jbyteArray imageIn، jint widthIn، jint heightIn، jobject imageOut، jint widthOut، jint heightOut، jint filter) {jbyte * cImageIn = (* env) -> GetByteArrayElements (env، imageIn ، NULL) ، jbyte * cImageOut = (jbyte *) (* env) -> GetDirectBufferAddress (env، imageOut)؛ toRGB565 ((unsigned short *) cImageIn، widthIn، heightIn، (unsigned int *) cImageOut، widthOut، heightOut)؛ (* env) -> ReleaseByteArrayElements (env، imageIn، cImageIn، JNI_ABORT)؛ } لجعلها أكثر إثارة للاهتمام أضفت بعض المرشحات إلى صورة الكاميرا.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
February 2019
Categories |