پردازش تصویر-تشخیص چهره
تشخیص پوست بدن با OpenCV
در پست قبلی (تشخیص رنگ با استفاده از OpenCV و Python)، نحوه تشخیص رنگ های مختلف درون یک تصویر را با استفاده از دستور inRange آموزش دادم. اکنون با استفاده از این آموزش و کمی فیلترهای مختلف، قصد دارم برنامه ای برای تشخیص پوست بدن بنویسم. برای امتحان درستی کد از دوربین Raspberry pi استفاده می کنم. کدها توسط OpenCV 3.0.0 و Python 2.7 نوشته شده اند.
# import the necessary packages
import numpy as np
import cv2
# define the upper and lower boundaries of the HSV pixel
# intensities to be considered 'skin'
lower = np.array([0,48,80], dtype = "uint8")
upper = np.array([189,224,255], dtype = "uint8")
ابتدا پکیج های لازم را فراخوانی می کنیم. پکیج Numpy برای Numerical Processing و پکیج cv2 برای OpenCV است.
برای تشخیص رنگ، ساده ترین روش استفاده از حالت HSV نسبت به BGR است. چون می خواهیم از دستور inRange برای ساخت ماسک استفاده کنیم به همبن دلیل باید محدوده ای برای رنگ پوست انتخاب کنیم. با کمی جستجو در اینترنت می توانید رنگ پوست مورد نظر را بدست آورید.
camera = cv2.VideoCapture(-1)
# keep looping over the frames in the video
while True:
# grab the current frame
success, frame = camera.read()
#convert it to the HSV color space,
# and determine the HSV pixel intensities that fall into
# the speicifed upper and lower boundaries
frame=cv2.resize(frame,(300,300),cv2.INTER_AREA)
converted = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
skinMask = cv2.inRange(converted, lower, upper)
چون می خواهیم از دوربین استفاده کنیم، پس با استفاده از دستور cv2.VideoCapture، استفاده از دوربین را آماده می کنیم.
برای اینکه عملیات پردازش بر روی هر فریم سریع تر انجام شود، بهتر است ابعاد فریم ها رو کوچکتر کنیم. به همین جهت، ابعاد فریم ها را به 300 پیکسل کاهش می دهیم.
در قسمت بعدی هر فریم را از حالت BGR به HSV تبدیل می کنیم و در آخر توسط دستور inRange یک ماسک براساس رنگ پوست می سازیم.
# apply a series of erosions and dilations to the mask
# using an elliptical kernel
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10))
skinMask = cv2.erode(skinMask, kernel, iterations = 2)
skinMask = cv2.dilate(skinMask, kernel, iterations = 2)
# blur the mask to help remove noise, then apply the
# mask to the frame
skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
skin = cv2.bitwise_and(frame, frame, mask = skinMask)
در برخی مواقع ممکن است قسمت های کوچک و اشتباهی در تصویر مشخص شوند. برای از بین بردن این قسمت ها از فیلترهای erode و dilate استفاده خواهیم کرد. ولی قبل از آن یک ماتریس به شکل ellipse طراحی می کنیم و ابعاد آن را 10*10 انتخاب می کنیم. توجه کنید هرچه ابعاد ماتریس بیشتر باشد عملیات پردازش کندتر ولی نتیجه با کیفیت بالاتری خواهد بوذ.
در مرحله بعدی با استفاده از دستور cv2.bitwise_and، هر فریم را باخودش و برحسب ماسک AND خواهیم کرد.
# show the skin in the image along with the mask
cv2.imshow("images", np.hstack([frame, skin]))
# if the 'q' key is pressed, stop the loop
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()
در آخر نوبت به نمایش نتیجه می رسد. برای خروج از برنامه از کلید q استفاده خواهیم کرد. فراموش نکنید که در پایان برنامه حتما دوربین را آزاد کنید. شکل زیر نتیجه نهایی را نشان خواهد داد.
البته این روش مشکل های زیادی دارد. به عنوان مثال برای تشخیص رنگ افراد سیاه پوست نمی توان از این روش استفاده کرد. شاید یک روش علمی و بهتر استفاده از تشخیص چهره باشد. پس از مشخص شدن محدوده صورت می توان از رنگ چهره فرد یک نمونه گرفت و با آن یک محدوده برای ماسک ساخت. در پایان می توانید کد را از لینک زیر دریافت کنید.
حجم: 489 کیلوبایت
توضیحات: Skin Detector
================================
طراحی یک تقویت کننده دو طبقه با استفاده از ترانزیستورهای BJT
امروز تصمیم گرفتم یکی از پروژه های قدیمی که در مورد طراحی تقویت کننده دو طبقه با استفاده از ترانزیستورهای BJT هست، رو قرار بدم تا دوستانی که تمایل به طراحی تقویت کننده دارند، از اون بهره ببرند.
ویژگی های این تقویت کننده ترانزیستوری عبارت است از:
-
بهره ولتاژ حدود 100
-
امپدانس وروردی بالا
-
امپدانس خروجی پایین (در حدود 10 اهم)
در طراحی این تقویت کننده از ترانزیستور BC107 استفاده شده است که از رایج ترین و ارزان قیمت ترین ترانزیستورهای BJT هست. همچنین از یک فیدبک ساده در این تقویت کننده استفاده شده است تا شکل موج خروجی با کیفیت بالا و تقارن بهتری تولید شود. برای شبیه سازی، از نرم افزار Pspice استفاده شده است.
حجم: 5.01 مگابایت
توضیحات: Two Stage BJT Amplifier
============================
طراحی و ساخت برد Daisy
امروز تصمیم دارم شماتیک و PCB یکی از بردهایی که طراحی و ساختم رو قرار بدم. برای طراحی برد از نرم افزار Altuim Designer استفاده شده است. این برد دارای یک تراشه FPGA از خانواده Spartan-6 و یک میکروکنترلر ARM از خانواده stm32f103 می باشد، که از طریق 16 پایه با یکدیگر در ارتباط هستند. و ابعاد برد در حدود 12*5 می باشد.
یک حافظه جانبی از شرکت ATMEL به منظور برنامه ریزی تراشه FPGA روی برد قرار داده شده است که نسبت به خود حافظه های شرکت xilinx ارزان تر و کوچکتر بوده است. کلاک مورد نیاز FPGA از طریق دو نوسان ساز تامین می شود. برای میکروکنترلر نیز یک کریستال 16MHz در نظر گرفته شده است. برنامه ریزی FPGA از طریق پروتکل JTAG انجام می شود. همچنین این روند برای میکرو از طریق پروتکل های JTAG و SW امکان پذیر می باشد. از طرفی، یک تراشه FT232 به منظور پروگرام کردن میکرو از طریق USB و BOOTLOADER استفاده شده است که در پست های آینده نحوه این کار را توضیح خواهم داد.
این برد از دو برد جدا از هم تشکیل شده است که طبقه اول شامل تراشه های پردازشی ، پورت های برنامه ریزی، پورت های منبع تغذیه و تعدادی LED است و برد دوم با در اختیار داشتن کلیدهای فشاری، LED، دیپ سوییچ جنبه آموزشی این برد را بر عهده دارد.
حجم: 1.11 مگابایت
توضیحات: Daisy board-PCB & Schematic
=============================