فحص الباركود باستعمل مكتبة الفايربيز اندرويد
01 July
مقدمة
الدرس الاخير من سلسلة التعلم الالي باستعمال فاير بيز و ضيفنا اليوم هو barcode حيث سيتمكن تطبيقك من قراءة مختلف انواع الباركودات و يعتبر الباركود هو الوسيلة الافضل لنقل معلومة من العالم المادي الى العالم الافتراضي لانه سهل القراءة للالة كالعادة اكثرنا من الكلام .تطبيقات تستخدم تقنية barcode
- سناب تشات : للتعرف على حسابات المستخدمين
- واتساب ويب : لتسجيل الدخول الى وتساب ويب من خلال الهاتف
ما هو الباركود barcode :
اظن ان مفهوم الباركود واضح بالنسبة لك لهذا سنتتقل مباشرة الى انواع الباركود و كيف يمكن صنع باركود خاص بك .انواع الباركود
-
Code 128 (
FORMAT_CODE_128
) -
Code 39 (
FORMAT_CODE_39
) -
Code 93 (
FORMAT_CODE_93
) -
Codabar (
FORMAT_CODABAR
) -
EAN-13 (
FORMAT_EAN_13
) -
EAN-8 (
FORMAT_EAN_8
) -
ITF (
FORMAT_ITF
) -
UPC-A (
FORMAT_UPC_A
) -
UPC-E (
FORMAT_UPC_E
) -
QR Code (
FORMAT_QR_CODE
) -
PDF417 (
FORMAT_PDF417
) -
Aztec (
FORMAT_AZTEC
) -
Data Matrix (
FORMAT_DATA_MATRIX
)
بما ان هذا ليس موضوعنا فساترك لك ابرز المواقع التي يمكنك من خلالها صنع QR code لتطبيقك مثلا .
قبل ان نبدا
1-اذا لم تقم باضافة فايربيز الى تطبيقك حتى الان فيمكنك ذلك من خلال اتباع خطوات بسيطة في تدوينة سابقة .2-اضف السطر التالي الى dependencies
build.gradle -> app level
dependencies {
// ...
implementation 'com.google.firebase:firebase-ml-vision:16.0.0'
}
<meta-data android:name="com.google.firebase.ml.vision.DEPENDENCIES" android:value="text"/>
4- اذونات الكاميرا ان كنت تريد استعمالها و اذونات الوصول الى الذاكرة يمكنك لهذه التدوينة ان تساعدك .
واجهة التطبيق :
بالتاكيد واجهة التطبيق تعود اليك و التطبيق الذي استعمله فيه ملفين ل xml الاول باسم image_labeling.xml و التاني باسم bottom_sheet.xml و كلاهما موجودان على github وليست هناك حاجة الى ارفاقهما مع التدوينة
انا استعمل مكتبة للكاميرا بدلا من api الرسمي من اندرويد اسم المكتبة Fotoapparat
فحص الباركود
الفكرة العامة :حسنا لدي تطبيق يحصل على الصور اما من التقاطها مباشرة او من خلال اخدها من ذاكرة الهاتف في كلتا الحالتين سنحول الصورة الى bitmap و نقوم بتمريرها الى دالة باسم scanBarCode(bitmap:Bitmap) هذه الدالة تقوم باخد bitmap و تقوم بصنع نسخة منها قابلة للتعديل لان الاصلية ليست كذلك نمرر الصورة الى الفايربيز و يقوم باعطائنا احداثيات الباركود في الصورة boundingBox نقوم نحن برسم اطار احمر على الباركود من خلال دالة drawRect() و ناخد القيم المآخودة من الباركود rawValue .
ربما الكود ابسط :
class Mlearing : AppCompatActivity() {
lateinit var sheetBehavior: BottomSheetBehavior
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.image_labeling)
setSupportActionBar(toolbar)
sheetBehavior = BottomSheetBehavior.from(bottom_sheet)
val fotoapparat = Fotoapparat(context = this, view = camera_view)
fotoapparat.start()
//اخد صورة
takePic.setOnClickListener {
val photoResult = fotoapparat.takePicture()
photoResult
.toBitmap()
.whenAvailable { bitmapPhoto ->
scanBarCode(bitmapPhoto!!.bitmap)
}
}
//اخد الصورة من الهاتف
fromDevice.setOnClickListener {
val photoPickerIntent = Intent(Intent.ACTION_GET_CONTENT)
photoPickerIntent.type = "image/*"
startActivityForResult(photoPickerIntent, 1)
}
}
private fun scanBarCode(bitmap: Bitmap) {
//تحويل بيتماب الى بيتماب قابل للتعديل
val mBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
val canvas = Canvas(mBitmap)
//الحصول على الكود
val image: FirebaseVisionImage = FirebaseVisionImage.fromBitmap(bitmap)
val detector = FirebaseVision.getInstance().visionBarcodeDetector
detector.detectInImage(image)
.addOnSuccessListener {
// انتهى بنجاح
Log.e("", "gooo")
for (barcode in it) {
val bounds = barcode.boundingBox
val corners = barcode.cornerPoints
val redPaint = getPaint(Color.RED, 20f)
canvas.drawRect(bounds, redPaint)
val rawValue = barcode.rawValue
Toast.makeText(this, "raw:$rawValue", Toast.LENGTH_LONG).show()
val valueType = barcode.valueType
Log.e("RAW VAL", "$rawValue | $valueType | ${barcode.displayValue}")
}
mImage.setImageBitmap(mBitmap)
mImage.visibility = View.VISIBLE
}.addOnFailureListener {
// خطا ما وقع
Toast.makeText(baseContext, "Sorry, something went wrong!", Toast.LENGTH_SHORT).show()
}
}
private fun getPaint(color: Int, width: Float = 1f): Paint {
val p = Paint()
p.style = Paint.Style.STROKE
p.strokeWidth = width
p.isAntiAlias = true
p.isFilterBitmap = true
p.isDither = true
p.color = color
return p
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
val chosenImageUri = data.data
val mBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, chosenImageUri)
scanBarCode(mBitmap)
}
}
}
الناتج
للعلم فان النتائج كانت رائعة و اعجبتني و هذه screenshots منها يمكنك تجربتها على اي منتج في المنزل و ستجد انها تعمل بشكل جيد .
للعلم فان وقت الاستجابة يطول و يمكنك جعله اقصر اذ حددت نوع الباركود الذي ترغب في فحص و يمكنك الاطلاع على المزيد من
الموقع الرسمي .
اترك لنا تعليقا