در ادامه مبحث بسیار جذاب و پر کاربرد پردازش تصویر، با نرم افزار OpenCV بخش دوم را شروع میکنیم. در آموزش قبلی با نحوه نصب opencv روی رزبریپای آشنا شدیم. بخشهایی از جمله حذف نرم افزارهای اضافی، دستورات نصب OpenCV و تست موقیت آمیز بودن نصب Open CV در رزبری پای همگی توضیح داده شدند. بخش دوم آموزش نرم افزار OpenCV در رزبری پای از سه بخش تشکیل شده است. در بخش اول شیوه خواندن، ذخیره و نمایش عکس آموزش داده میشود. در بخش دوم شیوه خواندن و نمایش ویدیو و سپس در بخش سوم شیوه ذخیره سازی ویدیو بررسی میشود. در ادامه آموزش پردازش تصویر OpenCV رزبری پای با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.
۱- خواندن، نمایش و ذخیره تصویر
خواندن تصویر در OpenCV رزبری پای
از تابع زیر برای خواندن یک تصویر استفاده میشود.
cv2.imread()
در این تابع از دو آرگومان استفاده میشود که اولی آدرس کامل تصویر و دومی چگونگی خواندن تصویر داده شود که مشخصههای آن عبارتند از:
- cv2.IMREAD_COLOR: بارگیری تصویر در حالت رنگی (این مشخصه پیش فرض میباشد.)
- cv2.IMREAD_GRAYSCALE: بارگیری تصویر در حالت سیاه و سفید
- cv2.IMREAD_UNCHANGED: تصویر را همانطور که هست بارگیری میکند (به همراه شفافیت)
به جای این مشخصهها میتوان از اعداد ۱,۰,-۱ استفاده کرد. نمونه کد استفاده از این تابع را در زیر میبنید که تصویر photo.jpg را در متغییر img ذخیره میکند و بعدا میتوان از آن استفاده کرد:
import cv2 # بارگیری تصویر در حالت سیاه و سفید img = cv2.imread('photo.jpg',0)
نمایش تصویر در OpenCV
حال برای نمایش تصویر در یک پنجره با سایز تصویر از تابع زیر استفاده میکنیم:
cv2.imshow()
در این تابع از دو آرگومان استفاده میشود که اولی نام پنجره و دومی متغییر تصویر میباشد.
نمونه کد نمایش تصویری که در مرحله قبلی خواندیم:
cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()
تابع cv2.waitKey () یک تابع متصل به کیبورد میباشد و آرگومان آن زمان به میلی ثانیه میباشد. این تابع به اندازه زمان داده شده در تابع منتظر یک کلید میماند و اگر زمان ۰ داده شود تا زمان فشار دادن کلید منتظر میماند.
تابع cv2.destroyAllWindows() تمامی پنجره هایی که در مراحل قبلی ساخته ایم میبندد. برای بستن یک پنجره خاص میتوان از تابع cv2.destroyWindow() استفاده کرد و از نام پنجره به عنوان آرگومان تابع استفاده کرد.
ذخیره تصویر در نرم افزار OpenCV
برای ذخیره تصویر از تابع زیر استفاده میشود:
cv2.imwrite()
در این تابع از دو آرگومان استفاده میشود که اولین آرگومان نام فایل، آرگومان دوم متغییر تصویری است که می خواهید ذخیره کنید.
نمونه کد کلی از یک برنامه را در زیر میبینید که با دوربین رزبری پای Raspberry pi Camera عکس برداری میکند و عکس سیاه و سفید را میتوان ذخیره کرد:
from picamera import PiCamera import cv2 #عکس برداری با دوربین رزبری پای و ذخیره آن camera = PiCamera() camera.capture('photo.jpg') #خواندن تصویر در حالت سیاه و سفید و نمایش آن img = cv2.imread('photo.jpg',0) cv2.imshow('image',img) # منتظر یک کلید خاص k = cv2.waitKey(0) & 0xFF #منتظر کلید Esc برای خروج if k == 27: cv2.destroyAllWindows() #منتظر کلید s برای ذخیره عکس elif k == ord('s'): cv2.imwrite('gray.png',img) cv2.destroyAllWindows()
نکته: برای سیستم های ۶۴ بیت از k = cv2.waitKey(0) & 0xFF
و برای بقیه سیستم ها از k = cv2.waitKey(0)
استفاده میشود.
نکته: کد اسکی کلید Esc عدد ۲۷ میباشد.
نکته: برای تعریف کلید از تابع ord(”) استفاده میکنید.
۲- خواندن و نمایش ویدیو در OpenCV
کار با فیلم و استفاده از دوربین رزبری پای
برای این بخش از یک نمونه کد استفاده میکنیم که فیلم را بصورت زنده از دوربین رزبری پای دریافت کرده و آن را بصورت سیاه و سفید نمایش میدهد:
from picamera.array import PiRGBArray from picamera import PiCamera import cv2 camera = PiCamera() camera.resolution = (640, 480) rawCapture = PiRGBArray(camera, size=(640, 480)) for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): image = frame.array gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow("Frame", gray) rawCapture.truncate(0) if cv2.waitKey(1) & 0xFF == ord("q"): break cv2.destroyAllWindows()
کلاس PiRGBArray که آن را از طریق کتابخانه picamera.array وارد برنامه کرده ایم یک آرایه ۳ بعدی برای ما تولید میکند که در برنامه از آن استفاده میکنیم. با این خط کد رزولوشن دوربین را مشخص میکنیم:
camera.resolution = (640, 480)
سپس با خط کد زیر تصویر دوربین را وارد آرایه میکنیم و در rawCapture ذخیره میکنیم:
rawCapture = PiRGBArray(camera, size=(640, 480))
سپس با استفاده از یک حلقه شروع به فیلم برداری میکنیم و در frame ذخیره میکنیم:
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
اطلاعات آرایه را داخل image ذخیره میکنیم:
image = frame.array
حال تصاویر را بصورت سیاه و سفید در gray ذخیره میکنیم:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
تصویر را در پنجره Frame به نمایش در میآوریم:
cv2.imshow("Frame", gray)
با استفاده این قطعه کد اطلاعات آرایه را خالی میکنیم تا مجددا آن را با تصویر بعدی پر کنیم:
rawCapture.truncate(0)
در آخر با فشار دادن کلید q برنامه بسته میشود.
نکته: برای استفاده از یک فیلم از ضبط شده میتوانید از نمونه کد زیر استفاده کنید:
import cv2 #ذخیره ویدیو در cap cap = cv2.VideoCapture('vtest.avi') #چک کردن اینکه فایل قابل باز شدن هست یا خیر while(cap.isOpened()): #خواندن ویدیو ret, frame = cap.read() #تغییر رنگ ویدیو gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #نمایش ویدیو cv2.imshow('Frame',gray) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
۳- ذخیره ویدیو در نرم افزار OpenCV
حال برای ذخیره ویدیو از نمونه کد زیر استفاده میکنیم که فیلم را برعکس کرده و شروع به ذخیره میکنید و با فشار دادن کلید q ضبط را متوقف کرده و ویدویو را با نام output.avi ذخیره میکند:
from picamera.array import PiRGBArray from picamera import PiCamera import cv2 camera = PiCamera() camera.resolution = (640, 480) rawCapture = PiRGBArray(camera, size=(640, 480)) fourcc = cv2.cv.CV_FOURCC(*'XVID') out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): image = frame.array image = cv2.flip(image,0) out.write(image) cv2.imshow('Frame',image) rawCapture.truncate(0) if cv2.waitKey(1) & 0xFF == ord('q'): break out.release() cv2.destroyAllWindows()
قطعه کد زیر کدک ذخیره سازی ویدیو را با FOURCC مشخص میکند(فرمت های قابل استفاده: DIVX, XVID, MJPG, X264, WMV1, WMV2):
fourcc = cv2.cv.CV_FOURCC(*'XVID')
قطعه کد بعدی دارای ۴ آرگومان است که به ترتیب نام فایل، کد fourcc، عدد فریم بر ثانیه و سایز ویدیو را مشخص میکنند:
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
با قطعه کد زیر تصویر را بصورت عمودی میچرخانیم(داری دو آرگومان است که اولی تصویر ما و دومی میتوانید اعداد ۰,۱,-۱ را بگیرد که برای چرخواندن در جهات مختلف است):
image = cv2.flip(image,0)
با این قطعه کد یکی یکی فریم ها را در فایل ویدیویی ذخیره میکنیم:
out.write(image)
و با این قطعه کد فایل ویدیویی را میبندیم و ذخیره میکنیم:
out.release()
امیدوارم این قسمت آموزش برای شما مفید واقع شده باشد.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک و دانشجوکیت و digispark و daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۰۳۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
با سلام
به هنگام استفاده از این کد در قسمت ذخیره حجم فایل روی ۵kb ثابت میمونه و بیشتر نمیشه
دلیلش رو میدونین؟
سلام
چه اروری در ترمینال دریافت میکنید؟
سلام در خواست راهنمایی و آموزش خصوصی بصورت آنلاین دارم ممنون میشم بتونیم صحبت کنیم.
با سلام
کاربر گرامی برای دریافت راهنمایی از طریق بخش نظرات اقدام بفرمایید. یا اینکه اگر نیاز به همکاری و یا دریافت خدمات ویژه هستید به دانشجو کیت مراجعه و از بخش پشتیبانی، تیکت ارسال کنید.
عالی بود ممنون
سلام وقت بخیر،
من قصد دارم همین موضوع بالا رو روی یک لپتاپ یا PC با یک دوربین اکسترنال پیاده کنم، اگر راهنمایی بفرمایید بسیار ممنون میشم
سلام وقت شما هم بخیر
Opencv روی هر سیستمی قابل اجراست و با نصب پایتون و انجام همین مراحلی که توضیح داده شده میتونین کار را انجام بدین فقط باید دستورات مربوط به دوربین رزبری پای را با وب کم جایگزین کنید که باید از توابعی که برای cv2.VideoCapture(0) تعریف شده استفاده کنید.
سلام مهندس خسته نباشی
یه سوالی برام پیش اومده …من تو زمینه پردازش با برد رزبری مبتدی هستم ….یکی از دوستان در شروع بهم پیشنهاد کردن از سیستم عامل اوبونتو استفاده کنم به جای ویندوز …..من خودم اصلا با محیط اوبونتو راحت نیستم و می خوام از شما بپرسم آیا وتقعا اوبونتو بهتره یا نه؟؟؟
سلام
محیط لینوکسی برای انجام کار های پردازش تصویر بخصوص با زبان پایتون خیلی بهتر عمل میکنه و پیشنهاد ما به شما هم همین هستش
محیط سیستم عامل هم عادتی هستش ولی شما زیاد نیاز به محیط سیستم عامل نخواهید داشت و بیشتر محیط شما برنامه نویسی خواهد بود.
سلام بهترین زبان برنامه نویسی برای این کار چیه
سلام
بهترینش برای سیستم عامل لینوکسی زبان پایتون و برای ویندوز زبان c هستش
تشخیص چهره با آردوینو هم امکان پذیر است ؟ و فرقش با استفاده از رزبری پی هست؟
خیر امکان تشخیص چهره با آردوینو نیست و نیاز به پردازنده قوی تری مانند رزبری پای است
سلام و خسته نباشید خدمت گروه بزرگ دیجی اسپارک .
من الان از وقتی وارد سایت شدم واقعا گم شدم . و چندتا سوال داشتم .
یک . الان من میتونم کلیپ های اموزشی هر بحثی که دوس داشتم و داشته باشم ؟ و به چه صورت ؟
دو . ایا همه مطالب اموزشی به صورت فایل متنی هست؟
من دنبال پردازش تصویر با دوربین رزبری پای هستم کارهایی مثل تشخیص رنگ
چطور میتونم به اموزش ها دسترسی پیدا کنم ؟
با سلام
کاربر گرامی نیازی نیست سوالتان را در چندین بخش مختلف مطرح کنید. کافیست منتظر باشید تا پاسخ سوال شما منتشر شود.
سلام و خسته نباشید خدمت گروه بزرگ دیجی اسپارک .
من الان از وقتی وارد سایت شدم واقعا گم شدم . و چندتا سوال داشتم .
یک . الان من میتونم کلیپ های اموزشی هر بحثی که دوس داشتم و داشته باشم ؟ و به چه صورت ؟
دو . ایا همه مطالب اموزشی به صورت فایل متنی هست؟
من دنبال پردازش تصویر با دوربین رزبری پای هستم کارهایی مثل تشخیص رنگ
چطور میتونم به اموزش ها دسترسی پیدا کنم ؟
سوم : من کل بحث راه اندازی دوربین و کار با برد رزبری پای و … اینارو میخواستم باید کجا برم و چیکار کنم ؟
با سلام و تشکر از شما
آموزش های دیجی اسپارک همگی به صورت پروژه محور هستند و به این صورت که بتوانید جلسه به جلسه دنبال کنید، مطلبی در سایت موجود نیست. در خصوص کلیپ هم دقت داشته باشید که در این جا ما آموزش میدهیم ولی ویدیو فقط به صورت معرفی پروژه است.
در خصوص پردازش تصویر هم به لینک زیر مراجعه کنید.
پردازش تصویر
سلام ببخشید من این کارا رو انجام دادم حالا میخوام دوربین رزبری مثل یک ورودی هوشمند عمل کنه و هرجا که مثلا رنگ قرمز رو مشاهده کرد تصویر بگیرهو ذخیره کنه . یا برای مثال هرجا یک تارگتی براش تعریف کردیم اونو عکسشو برامون بگیره . مثل سیب یا … چطور امکانش هست این مورد ؟
سلام
در این سایت میتوانید پاسخ سوال خود را بیابید
https://stackoverflow.com/questions/52078231/get-a-quanity-of-pixels-with-specific-color-at-image-python-opencv
سلام خط ۹ از ذخیره ویدیو این ارور رو میده
AttributeError: module ‘cv2.cv2’ has no attribute ‘cv’
سلام بجای
cv2.cv.CV_FOURCC(*’XVID’)
از
cv2.CV_FOURCC(*’XVID’)
استفاده کنید
سلام
آیا امکان اتصال چند دوربین و دریافت تصویر همزمان آنها با رزبری پای وجود دارد؟
با سلام
برد رزبری پای فقط دارای یک اسلات دوربین است.