بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

شناسایی چهره ، مقایسه تصویر نمای بسته ی دو شخص- حل شد + نمونه کد

مدیریت گفتگو
مجتبی یگانه 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام

فرض کنید بخوایم کاری شبیه به باز کردن قفل صفحه با شناسایی چهره انجام بدیم ، اما کارم خیلی حساس نیست و در حد یه پروژه ی تست هست ، من 2 تا تصویر دارم A.jpg و B.jpg میخوام این 2 تا تصویر رو بدم به یه لایبرری بگه یه نفر هستن یا نه !

چون فعلا نه دانش شروع پردازش تصویر رو دارم ، نه وقت اش رو ، بیشتر دنبال کتابخانه میگردم و کتابخانه ای که معمولا توصیه میشه openCV هست ، کسی باهاش کار کرده ، یا کلا در این زمینه اطلاعاتی داره که باعث بشه حتی 1 دقیقه کمتر وقت صرف کنم !

تا الان تونستم با FaceDetector چهره ها رو تشخیص بدم ، بگم چند نفر تو عکس هستن و..  ، اما واقعا واسه مقایسه شون هیچ ایده ای ندارم :|

نظرات

hamidd 11 سال پیش
خودم هیچ کدومشو نو امتحان نکردم ولی یه سری اطلاعات میدم. حالا که وقتشو نداری ، openCV رو بی خیال شو چون باید به Android NDK سوییچ کنی و قبلا هم باهاش کار نکردی. پس وقتتو زیاد میگیره. با javacv فکر کنم بشه این کاری که میگی رو انجام داد و احتمالا نیاز نیست به Android NDK سوییچ کنی. همچنین چون میخوای چهره رو تشخیص بدی (Recognize کنی) نه این که چهره رو توی تصویر پیدا کنی (Detect کنی) باید دنبال face recognition باشی نه FaceDetector .حتی اگه دنبال Face Detector هم میبودی خود Android Sdk داره android.media.FaceDetector.Face لینک نیازی به استفاده از لایبراری javaCV یا openCV هم نداشتی.با این حال لینک هم هست که بر پایه ی openCV نوشته شده. لینک دانلود سورس کد هم توی لینک موجوده، نگاه کن ببین بدردت میخوره یا نه.
hamidd 11 سال پیش
اینم لینک دانلود sdk و مثال لینک برای لینک آخر.
مجتبی یگانه 11 سال پیش
مرسی حمید جان ، اینا رو تست نکردم ، اما فعلا رو جاوا به جاهای خوبی رسیدم ! ، تموم شد خبرش رو میدم ، مرسی

پاسخ‌ها 1

مجتبی یگانه 11 سال پیش

بالاخــــــــــــــــــــــــــــــــــــره به نتیجه رسیدم ، اصلا اشتباه ام این بود از اولش خودم رو دست کم گرفتم  رفتم دنبال کتابخونه :|

این از اون سورس کدهای با ارزشه ! ، درج میکنم تا یادمون باشه کار نشد نداره D:

مقایسه ی تصاویر در 50 خط کد :

 public static StructResult FileToFileCompare(File file1, File file2) {
	Bitmap img1 = null;
	Bitmap img2 = null;
	try {
		Options option1 = new Options();
		Options option2 = new Options();

		img1 = BitmapFactory.decodeFile(file1.toString(), option1);
		img2 = BitmapFactory.decodeFile(file2.toString(), option2);

		int width1 = option1.outWidth;
		int width2 = option2.outWidth;
		int height1 = option1.outHeight;
		int height2 = option2.outHeight;
		if ((width1 != width2) || (height1 != height2)) {
			System.err.println("size not Matches");
			return null;
		}
		long diff = 0;
		for (int y = 0; y < height1; y++) {
			for (int x = 0; x < width1; x++) {
				int pix1 = img1.getPixel(x, y);
				int pix2 = img2.getPixel(x, y);
				int r1 = Color.red(pix1);
				int g1 = Color.green(pix1);
				int b1 = Color.blue(pix1);

				int r2 = Color.red(pix2);
				int g2 = Color.green(pix2);
				int b2 = Color.blue(pix2);

				diff += Math.abs(r1 - r2);
				diff += Math.abs(g1 - g2);
				diff += Math.abs(b1 - b2);
			}
		}
		double n = width1 * height1 * 3;
		double p = diff / n / 255.0;
		double difPrecentage = (p * 100.0);
		System.out.println(file1.getName() + " diff percent wtih " + file2.getName() +
" is : " + difPrecentage + "%"); return new StructResult(file2.getName(), difPrecentage); } catch (Exception e) { e.printStackTrace(); } return null; }

برای مقایسه ی N تصویر هم کافیه تفاوت ها رو با هم مقایسه کنید ، اونی که کمترین تفاوت رو داشت ، میشه نزدیک ترین تصویر به تصویر اصلی

نظرات

javac 11 سال پیش
تشکر بابت سورس کد :) ، اون متغیر های n و p چی رو محاسبه میکنند؟
Hossein Kurd 11 سال پیش
کلاس StructResult رو معرفی نمی کنی ؟
hamidd 11 سال پیش
آفرین! درستش کردی :) ولی این هنوز به 50 خط نرسیده باید 6 خط دیگه هم اضافه کنی :)
مجتبی یگانه 11 سال پیش
@javac متغییر n تعداد کل R G B های ما هست ، که چون به ازای هر پیکسل 3 رنگ تشکیل دهنده داریم ، میشه تعداد پیکسل های عکس * 3 و متغییر p نسبت شباهت هست ، که پائین تر به درصد هم محاسبه شده / اگر اون 255.0 هم براتون نا مفهوم هست ، باید بگم منظور 0 تا 255 کد های رنگی هست
مجتبی یگانه 11 سال پیش
در مورد کلیت قضیه ، یه جرقه ای تو زهنم زده شده که پیکسل به پیکسل برسی کنم ، اما این سورس کد سورس کدی نیست که فقط من نوشته باشم ، نمونه اش تو اینترنت زیاد هست ، فقط من ازشون ایده گرفتم و مشابه اش رو با BitMap نوشتم ، چون تو جاوا با BufferedImage نوشته میشه که تو اندروید نمیشه ازش استفاده کرد.
مجتبی یگانه 11 سال پیش
@ حسین کرد ، میشه با یکم فکر بدست اش آورد ، همون طور که اسپریت جان به دست آوردن :) / @حمید D: ، آره دیگه ! ، واسه ما کار نشد نداره D: ، اون 6 خط ام باید چند لاگ چاپ کنم ، با تشکر از حمید ، خودم ، پدر مادرم ، استاد آقاجانی، پرفوسور ریچارد و... D:
Ali 11 سال پیش
هیچ راهی نیست که بشه از BufferedImage توی اندروید استفاده کرد؟ خیلی قابلیت‌های خوبی داره...
مجتبی یگانه 11 سال پیش
سوالی در همین مورد در انجمن مطرح کردم ، حتی تو استک هم مطرح کردم ،جواب این بود که از کلاس بیت مپ استفاده کن ، تمام متد های bufferedImage رو داره :)
Ali 11 سال پیش
من چند وقت پیش رفته بودم سراغ یه کتابخونه جاوا برای پردازش تصویر در اندروید اما متدهای اون ورودی‌هایی از جنس BufferedImage می‌خواست در نتیجه ولش کردم؛ حالا بنظرتون راهی هست که بشه ازش استفاده کرد؟ (کتابخونه بسیار خوبی بود خیلی از پردازش تصویرهای معروفی که توی متلب انجام می‌دهند رو بوسیله اون توی جاوا به راحتی می‌شد انجام بدی)
مجتبی یگانه 11 سال پیش
من چند مورد رو تو جاوا پیاده کردم خیلی خوب جواب میدادن ولی یکی اینکه سنگین و حجیم بودن و اینکه نشد بیارمش تو اندروید - چون سواد کافی تو این زمینه نداشتم - وقتی میشه کلاس های مشابه رو پیدا کرد که به هر دو کلاس و متد هاشون مسلط باشیم که من نبودم :|
uncocoder 11 سال پیش
در واقع مقایسه دو تصویر یه فرآیند آماری هست. توزیعی به اسم chi2 ( خی 2 ) هست که بر اساس معیار اختلافات سنجیده میشه. کلاً آمار درک کردنش خیلی سخته اما اگر علاقه مند بودید به دقیقتر کردن محاسبات، بهتر است مباحث آماری مربوط به «طرح آزمون» را مطالعه نمایید.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .