رتبه موضوع:
  • 4 رای - 4.5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش قدم به قدم opencv
#1
opencv یک کتابخانه متن باز برای پردازش تصویر و بینایی ماشین می باشد.
opencv مخفف کلمات ِ open computer vision می باشد، که واژه open حکایت از متن باز بودن آن دارد.

ابتدا این کتابخانه را دانلود کنید، دقت شود که این دانلود، نسخه 2.1 opencv و مربوط به ویژاول استدویو 2008 می باشد.

سپس آنرا نصب کنید و گزینه add opencv to the system path را در هنگام نصب، تیک بزنید.

visual studio را اجرا کنید و در قسمت ِ منوی بالایی آن، بترتیب مراحل زیر را طی کنید:

tools>options>project an solutions>vc++ directories
سپس، وارد پنجره ای زیر خواهیم شد:
[عکس: vc2k8_directories.jpg]


در قسمت ُ سمت راست-بالا کمبو باکسی را مشاهده میکنیم، مراحل زیر را طی میکنیم:

* گزینه executable files را از کمبو باکس انتخاب می کنیم، سپس پوشه ای را ایجاد میک نیم و محل پوشه bin را که داخل پوشه اصلی opencv می باشد را مشخص می کنیم. برای مثال : C:\OpenCV2.1\bin
* گزینه include را از کمبو باکس انتخاب می کنیم، سپس پوشه ای را ایجاد می کنیم و محل پوشه include را که داخل پوشه اصلی opencv می باشد را مشخص می کنیم. برای مثال: C:\OpenCV2.1\include\opencv
* گزینه library را از کمبو باکس انتخاب می کنیم، سپس پوشه ای را ایجاد می کنیم و محل پوشه lib را که در داخل پوشه اصلی می باشد را مشخص می کنیم. برای مثال: C:\OpenCV2.1\lib
* گزینه source files را از کمبو باکس انتخاب می کنیم، سپس پوشه هایی را ایجاد میکنیم و محل های آنها را پوشه هایی که در زیر پوشه src می باشد را مشخص میکنیم. برای مثال:

C:\OpenCV2.1\src\cv
C:\OpenCV2.1\src\cvaux
C:\OpenCV2.1\src\cxcore
C:\OpenCV2.1\src\highgui
C:\OpenCV2.1\src\ml
کار config ویژوال استدیو ما هم تمام شد.
___________________
حال create project کنید، سپس از tree view سمت ِ چپ، گزینه ویژوال سی پلاس پلاس را انتخاب کنید، در شاخه win32 کلیک کنید، سپس پروژه ای از نوع ِ win32 console application بسازید.
در پنجره solution explorer بر روی root برنامه، کلیک راست کرده و properties را کلیک کنید.
به ترتیب مراحل زیر را طی کنید:
linker>input>additional dependencies
حال درون این text box، نام فایل هایی را که درون پوشه lib موجود در پوشه اصلی opencv می باشد، را جداگانه وارد کنید و enter بزنید، حاصل چیزی مانند زیر می شود:
cv210.lib
cxcore210d.lib
ml210d.lib
opencv_ffmpeg210.lib
cxts210.lib
cv210d.lib
cvaux210.lib
highgui210.lib
opencv_ffmpeg210d.lib
highgui210d.lib
cvaux210d.lib
cxcore210.lib
ml210.lib
سپس هنگامی که کلید ِ ok را میزنیم، مقدیر مذکور اینگونه نوشته می شوند:

cv210.lib cxcore210d.lib ml210d.lib opencv_ffmpeg210.lib cxts210.lib cv210d.lib cvaux210.lib highgui210.lib opencv_ffmpeg210d.lib highgui210d.lib cvaux210d.lib cxcore210.lib ml210.lib

کار config برنامه ما هم تمام شد.

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط hmdhmdhmd ، مهدی ابراهیمی ، siamakb ، h0x00i ، lord67 ، mirashkan ، itsu88 ، diamond87
#2
این اولین برنامه ایست که با هم اجرا می کنیم، در این برنامه قدم به قدم تا اجرای کامل برنامه پیش می رویم و در برنامه های آینده فرض را بر آن می گزاریم که شما آموزش های opencv را قدم به قدم پیش رفته ایید.

* ابتدا namespace زیر برنامه را اضافه میکنیم، برای اجرای opencv حداقل به نام دامنه های زیر احتیاج است:
کد پی‌اچ‌پی:
#include "highgui.h" 

* بر روی root برنامه که در solution explorer قابل دسترس می باشد، کلیک راست کرده و گزینه open folder in windows explorer را انتخاب میکنیم؛ از این موقع به بعد هر گاه گفته شد، فایل مورد ِ نظر را در پوشه برنامه ذخیره کنید و یا بخوانید، منظور همین پوشه فوق الذکر می باشد؛ حال درون پوشه برنامه یک عکس دلخواه paste کنید، برای مثال : stuff.jpg

* حال وارد ِ برنامه اصلی می شویم و کدهای زیر را می نویسیم:


کد پی‌اچ‌پی:
IplImage *img=cvLoadImage("stuff.jpg"); // 
برای ایجاد تصویر بکار می رود
کد پی‌اچ‌پی:
cvNamedWindow("window"); // 
پنجره ای را برای نمایش تصاویر ایجاد میکند
کد پی‌اچ‌پی:
cvShowImage("window",img); // 
تصویر دلخواه را در پنجره مورد نظر باز میکند
کد پی‌اچ‌پی:
cvWaitKey(); // 
تا زمان فشردن ِ کلیدی در صفحه کلید، برنامه را نگه می دارد

اکنون source برنامه ما اینگونه باشد:
کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "highgui.h"

int _tmain(int argc_TCHARargv[])

کد پی‌اچ‌پی:
IplImage *img=cvLoadImage("stuff.jpg");// 
برای ایجاد تصویر بکار می رود
کد پی‌اچ‌پی:
cvNamedWindow("window");// 
پنجره ای را برای نمایش تصاویر ایجاد میکند
کد پی‌اچ‌پی:
cvShowImage("window",img);// 
تصویر دلخواه را در پنجره مورد نظر باز میکند
کد پی‌اچ‌پی:
cvWaitKey();// 
تا زمان فشردن ِ کلیدی در صفحه کلید، برنامه را نگه می دارد


کد پی‌اچ‌پی:
return 0;

کلید F5 را میزنیم، در صورتی که هیچ خطایی در هنگام برنامه نویسی داشته باشید، تصویر زیر برای شما نمایش داده خواهد شد:



_____________
پایان قسمت دوم

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
#3
نمایش فیلم
_____________
در قسمت پیشین، ابتدایی ترین و مهمترین قسمت پردازش تصویر و opencv را که ' نمایش تصویر ' می باشد را با هم کار کردیم، در این قسمت به نمایش فیلم می پردازیم.

همانگونه که اطلاع دارید، یک فیلم ویدوئویی، مشتمل از یک سری از عکس های (فریم های) پشت سر هم می باشد که در یک بازه زمانی بصورت پشت سر هم نمایش داده می شوند، برای مثال هر 30 میلی ثانیه فریم ای جدیدی نمایش داده می شود، این واحد زمانی را FPS که به معنای frame per second می باشد، مشخص میکنند، حال یک فیلم که fps آن 30 می باشد، هر 30 میلی ثانیه تصویر بعدی فیلم را نمایش می دهد.

* بنابر آنچه که در بالا گفته شد، ما می توانیم یک فیلم را به چندین عکس تبدیل کنیم و در هر لحظه( مثالا هر 30 میلی ثانیه)، آنرا نمایش دهیم، برای اینکار ما ابتدا نیاز داریم از FPS فیلم مطلع شویم، برای اینکار از تکه کد زیر استفاده می کنیم:

کد پی‌اچ‌پی:
int fps=(int)cvGetCaptureProperty(
        
capture,
        
CV_CAP_PROP_FPS
        
); 
با استفاده از تابع cvGetCaptureProperty می توانیم به property های فیلم مورد نظرمان دست بیابیم، این تابع دو ورودی می گیرد که اولینش نام فیلم مورد نظر می باشد و دومین پارامتر آن خصوصیت مورد نظرمان می باشد، لازم به ذکر است که خروجی این تابع از نوع double می باشد و ما در اینجا چون مقداری مورد ِ نیاز ما از نوع int بود، مقدار خروجی تابع را تبدیل ضمنی کردیم.

* پیش از کد بالا لازم است ابتدا فیلم مورد نظرمان را ایجاد کنیم، با استفاده از تکه کد، شئی مورد نظرمان را ایجاد می کنیم:

کد پی‌اچ‌پی:
CvCapture *capture=cvCreateFileCapture("tree.avi"); 

همچنین ما می توانیم بجای خواندن ِ فیلم ثابت، ویدئو خود را آنلاین از وب کم دریافت کنیم:
CvCapture *capture=cvCreateCameraCapture(0);
شاید در اینجا این سئوال برایتان پیش آمده باشد که چه دلیل دارد که مقدار صفر را به عنوان ِ ورودی تابه مذکور نوشتیم، این عدد معرف این است که منظور ما اولین وبکم متصل به رایانه یمان می باشد، با این وردوی می توانیم وب کم های مختلف را جداگانه فراخوانی کنیم.

* با در نظر گرفتن اینکه شما قسمت پیشین این آموزش را مطالعه کرده اید، شیئی از نوع image تعریف می کنیم، این شئی برای نمایش دادن فریم های مختلف تصویر ما بکار می روند
کد پی‌اچ‌پی:
IplImage *frame=cvLoadImage("stuff.jpg");
    
cvNamedWindow("window"); 
تا اینجای کار، برنامه ما باید بدین گونه باشد:

کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "highgui.h"

int _tmain(int argc_TCHARargv[])

کد پی‌اچ‌پی:
CvCapture *capture=cvCreateFileCapture("tree.avi");// 
شئی مورد نظرمان را ایجاد میکنیم

کد پی‌اچ‌پی:
int fps=(int)cvGetCaptureProperty(// 
این تابع برای خواندن ِ خصوصیات فیلم استفاده می شود
کد پی‌اچ‌پی:
capture,// 
فیلم مورد نظر ما
کد پی‌اچ‌پی:
CV_CAP_PROP_FPS// 
مشخصه مورد نظر ما
کد پی‌اچ‌پی:
); 


کد پی‌اچ‌پی:
IplImage *frame=cvLoadImage("stuff.jpg");// 
برای ایجاد تصویر بکار می رود
کد پی‌اچ‌پی:
cvNamedWindow("window");// 
پنجره ای را برای نمایش تصاویر ایجاد میکند

کد پی‌اچ‌پی:
return 0;

* خوب حالا نیاز داریم که حلقه ای را ایجاد کنیم، و فریم به فریم فیلم را نمایش دهیم، برای نمونه حلقه زیر را می نویسیم:

کد پی‌اچ‌پی:
while(1)// 
بصورت نامحدود این حلقه را اجرا کن
کد پی‌اچ‌پی:

کد پی‌اچ‌پی:
frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
cvShowImage("window",frame);// 
فریم مورد نظر را نمایش بده
کد پی‌اچ‌پی:
cvWaitKey(fps);// 
به اندزه fps در این مرحله توقف کن
کد پی‌اچ‌پی:
if(!frame)break;// 
در صورت اتمام فیلم از این حلقه خارج شو
کد پی‌اچ‌پی:

شاید در اینجا این پرسش برایتان ایجاد شده باشد که چرا در داخل تابع cvWaitKey مقداری را نوشتیم، ذکر این نکته مهم می باشد که اگر داخل این تابع صفر و یا مقدار منفی نوشته شود، تا زمانی که کاربر، صفحه کلید را نفشرده است، برنامه در این خط توقف می کند ولی اگر مقدار مثبتی نوشته شود، به اندازه مقدار نوشته شد، در این خط صبر می کند و سپس برنامه را ادامه می دهد، واحد آرگومان این تابع بر حسب میلی ثانیه می باشد و مقدار پیش فرض آن صفر است.

اکنون برنامه ما بدینگونه است که در زیر نشان داده شده است، کلید F5 را زده، تا این برنامه اجرا شود:
کد پی‌اچ‌پی:
CvCapture *capture=cvCreateFileCapture("tree.avi");// 
شئی مورد نظرمان را ایجاد میکنیم

کد پی‌اچ‌پی:
int fps=(int)cvGetCaptureProperty(// 
این تابع برای خواندن ِ خصوصیات فیلم استفاده می شود
کد پی‌اچ‌پی:
capture,// 
فیلم مورد نظر ما
کد پی‌اچ‌پی:
CV_CAP_PROP_FPS// 
مشخصه مورد نظر ما
کد پی‌اچ‌پی:
); 


کد پی‌اچ‌پی:
IplImage *frame;// 
برای ایجاد تصویر بکار می رود
کد پی‌اچ‌پی:
cvNamedWindow("window");// 
پنجره ای را برای نمایش تصاویر ایجاد میکند

کد پی‌اچ‌پی:
while(1)// 
بصورت نامحدود این حلقه را اجرا کن
کد پی‌اچ‌پی:

کد پی‌اچ‌پی:
frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
cvShowImage("window",frame);// 
فریم مورد نظر را نمایش بده
کد پی‌اچ‌پی:
cvWaitKey(fps);// 
به اندزه fps در این مرحله توقف کن
کد پی‌اچ‌پی:
if(!frame)break;// 
در صورت اتمام فیلم از این حلقه خارج شو
کد پی‌اچ‌پی:

_____________
پایان قسمت سوم

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
#4
فیلتر بر روی وب کم
_____________

در پست های پیشین، با هم بر روی نشان دادن تصاویر متحرک (فیلم) ذخیره شده در دیسک کار کردیم، حال نوبت آن رسیده است که تصاویر خروجی از وب کم را دریافت کنیم و با فیلتر دلخواه آنرا نمایش دهیم؛ در این مثال ابتدا ما از فیلترمیانه (median) استفاده می کنیم و سپس با استفاده از فیلتر کنی (canny) مرز اشیائمان را نشان می دهیم.
لازم به ذکر است که فیلتر میانه در اینجا توضیح داده شده است.

* در قسمت پیشین، در باره تابع کار با دوربین، اشاره مختصری شد، حال در این برنامه از این تابع بصورت عملی استفاده می کنیم

کد پی‌اچ‌پی:
CvCapture *capture=cvCreateCameraCapture(0); 

* برای استفاده کردن از توابه فیلتر، ابتدا باید نام دامنه زیر را به برنامه یمان اضافه کنیم:
کد پی‌اچ‌پی:
#include "cv.h" 

* تابع ای که در زیر توضیح داده می شود، برای فیتر کردن تصویر، استفاده می شود

کد پی‌اچ‌پی:
cvSmooth(frame,frame,CV_MEDIAN); 
خروجی این تابع از نوع void می باشد، این تابع هفت ورودی دارد که پنج تای انتهایی آنها بصورت پیش فرض مقداردهی شده است، ورودی ما از سمت چپ به راست بصورت زیر می باشد:

ورودی اول: این آرگومان به عنوان تصویر مبدا ما گرفته می شود
ورودی دوم: این آرگومان به عنوان تصویر مقصد ما استفاده می شود، در صورتی که اندازه تصویر مقصد با تصویر مبدا متفاوت نباشد، می توان تصویر ورودی و خروجی یکسان باشند.
ورودی سوم: نوع فیلتر می باشد، ما برای اینکه بدانیم چه فیلترهایی برای این ورودی مجاز می باشد، بر روی تابع فوق الذکر راست کلیک می کنیم، و بر روی گزینه go to definition و یا go to declaration کلیک می کنیم، همانطور که می بینید، بصورت خودکار وارد کلاس هدر cv.h می شویم، در بالای تابع CV_MEDIAN، می توانیم لیست مجاز فیلترها را ببنیم، این فیلترها عبارت اند از :
کد پی‌اچ‌پی:
#define CV_BLUR_NO_SCALE 0
#define CV_BLUR  1
#define CV_GAUSSIAN  2
#define CV_MEDIAN 3
#define CV_BILATERAL 4 
خوب، قسمت اول برنامه ما تمام شد، حالا کدهای برنامه ما باید بگونه زیر باشند:
کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

int _tmain(int argc_TCHARargv[]) 
{
کد پی‌اچ‌پی:
CvCapture *capture=cvCreateCameraCapture(0);// 
شئی مورد نظرمان را ایجاد میکنیم
کد پی‌اچ‌پی:
IplImage *frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
cvNamedWindow("window");// 
پنجره ای را برای نمایش تصاویر ایجاد میکند

کد پی‌اچ‌پی:
while(1)// 
بصورت نامحدود این حلقه را اجرا کن
کد پی‌اچ‌پی:

کد پی‌اچ‌پی:
cvSmooth(
            
frame,// 
تصویر مبدا
کد پی‌اچ‌پی:
frame,// 
تصویر مقصد
کد پی‌اچ‌پی:
CV_MEDIAN// 
فیلتر دلخواه
کد پی‌اچ‌پی:
); 
کد پی‌اچ‌پی:
frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
cvShowImage("window",frame);// 
فریم مورد نظر را نمایش بده
کد پی‌اچ‌پی:
cvWaitKey(30);// 
به اندزه fps در این مرحله توقف کن
کد پی‌اچ‌پی:
if(!frame)break;// 
در صورت اتمام فیلم از این حلقه خارج شو
کد پی‌اچ‌پی:
}

    return 
0;

در قسمت دوم برنامه، می خواهیم مرز بین اشیا را مشخص کنیم؛ برای اینکار ابتدا باید تصویر را به grayscale تبدیل کنیم و در قدم بعد با تابع کنی مرز بین اشیا را مشخص کنیم؛ بنابرین گام های زیر را بر می داریم:

* تصویری هم اندازه و هم عمق با تصویر دریافتی از وبکم می سازیم ولی با این تفاوت که تصویر را با یک کانال تعریف می کنیم( یعنی تصویر را grayscale تعریف می کنیم)

کد پی‌اچ‌پی:
IplImage *dst=cvCreateImage(cvGetSize(frame),frame->depth,1);// 
تصویری دارای یک کانال که برای استفاده در فیلتر کنی از آن استفاده می شود

* در گام بعد تصویر وبکم را تبدیل (convert) به تصویر grayscale می کنیم

کد پی‌اچ‌پی:
cvCvtColor(frame,dst,CV_RGB2GRAY); 

* همانطور که می توان از فیلتر میانه فهمید، این فیلتر با ملایم کردن لبه های تیز تصویر، در پیدا کردن ِ مرز اشکال اصلی تصویر به ما کمک می کند، بنابرین این فیلتر را تغییر نمی دهیم.
* در آخر فیلتر کنی (canny) را بر روی تصویر اعمال می کنیم.

حال برنامه اصلی ما باید بدین شکل باشد:
کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"

#include "highgui.h"

#include "cv.h"


int _tmain(int argc_TCHARargv[])



کد پی‌اچ‌پی:
CvCapture *capture=cvCreateCameraCapture(0);// 
شئی مورد نظرمان را ایجاد میکنیم

کد پی‌اچ‌پی:
IplImage *frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
IplImage *dst=cvCreateImage(cvGetSize(frame),frame->depth,1);// 
تصویری دارای یک کانال که برای استفاده در فیلتر کنی از آن استفاده می شود

کد پی‌اچ‌پی:
cvNamedWindow("window");// 
پنجره ای را برای نمایش تصاویر ایجاد میکند


کد پی‌اچ‌پی:
while(1)// 
بصورت نامحدود این حلقه را اجرا کن

کد پی‌اچ‌پی:

کد پی‌اچ‌پی:
cvCvtColor(frame,dst,CV_RGB2GRAY);       


        
cvSmooth

کد پی‌اچ‌پی:
dst,// 
تصویر مبدا

کد پی‌اچ‌پی:
dst,// 
تصویر مقصد

کد پی‌اچ‌پی:
CV_MEDIAN// 
فیلتر دلخواه
کد پی‌اچ‌پی:
);  
       
        
cvCanny(dst,dst,10,100,3); 

کد پی‌اچ‌پی:
cvShowImage("window",dst);// 
فریم مورد نظر را نمایش بده

کد پی‌اچ‌پی:
cvWaitKey(3);// 
به اندزه سه میلی ثانیه fps در این مرحله توقف کن

کد پی‌اچ‌پی:
frame=cvQueryFrame(capture);// 
از فیلم مورد نظر، فریم فعلی آنرا واکاوی کن
کد پی‌اچ‌پی:
if(!frame)break;// 
در صورت اتمام فیلم از این حلقه خارج شو


کد پی‌اچ‌پی:
}


    return 
0;



منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
#5
ذخیره فیلم
_____________

بعد از خواندن، نمایش دادن و تغییر دادن تصویر، حالا نوبت به ذخیره سازی آن رسیده است، در opencv براحتی می شود فایل ویدئویی دلخواه را تنها با چند خط کد، می توان ذخیره کرد.

در اینجا ما فیلم دریافتی از وبکم را دریافت می کنیم، سپس فیلتر میانه را بر آن اعمال می کنیم، آنرا نمایش می دهیم و در آخر آنرا ذخیره می کنیم.

* در ابتدا ما با استفاده از تکه کد زیر قادر خواهیم شد، ساختاری برای ذخیره سازی تصاویر دریافتی ایجاد کنیم :

کد پی‌اچ‌پی:
CvVideoWriter *writer

کد پی‌اچ‌پی:
writercvCreateVideoWriter(// 
ساختاری برای نوشتن ِ تصویر استفاده می کنیم
کد پی‌اچ‌پی:
"out.avi",// 
فایل ای که می خواهیم آنرا ایجاد کنیم
کد پی‌اچ‌پی:
CV_FOURCC('P','I','M','1'),// 
فرمت ذخیره سازی
کد پی‌اچ‌پی:
25,//fps 
کد پی‌اچ‌پی:
cvSize(640,480),// 
اندازه تصویر
کد پی‌اچ‌پی:
1// 
رنگی یا تک رنگی بودن تصویر
کد پی‌اچ‌پی:
); 
فرمت هایی که ما می توانیم برای ذخیره سازی فیلم، استفاده کنیم، به شرح زیر است :
کد پی‌اچ‌پی:
CV_FOURCC('P','I','M','1')    = MPEG-1 codec
CV_FOURCC
('M','J','P','G')    = motion-jpeg codec (does not work well)
CV_FOURCC('M''P''4''2') = MPEG-4.2 codec
CV_FOURCC
('D''I''V''3') = MPEG-4.3 codec
CV_FOURCC
('D''I''V''X') = MPEG-4 codec
CV_FOURCC
('U''2''6''3') = H263 codec
CV_FOURCC
('I''2''6''3') = H263I codec
CV_FOURCC
('F''L''V''1') = FLV1 codec 
* سپس با استفاده از تابع زیر، می توانیم تصاویر را تک به تک در فایل مذکور ذخیره کنیم

کد پی‌اچ‌پی:
cvWriteFrame(writer,img); 

* و با استفاده از حلقه ای، تصاویررا تک به تک واکشی می کنیم و آنها را در فایل می نویسیم:
کد پی‌اچ‌پی:
for(int i 01500i++)
    {
        
img=cvQueryFrame(capture);
        
cvSmooth(frame,frame,CV_MEDIAN);
        
cvWriteFrame(writer,frame);
        
cvShowImage("win"frame);
        
cvWaitKey(1);

    } 
در اینجا به این دلیل مقدار cvWaitKey را یک داده ایم، که وب کم دچار crash نشود.
خوب برنامه تکمیل شده شده ما بصورت زیر می باشد

کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc_TCHARargv[])
{
    
IplImage *frame NULL;
    
CvCapture *capture cvCreateCameraCapture(CV_CAP_ANY);

    
CvVideoWriter *writer
کد پی‌اچ‌پی:
writercvCreateVideoWriter(// 
ساختاری برای نوشتن ِ تصویر استفاده می کنیم
کد پی‌اچ‌پی:
"out.avi",// 
فایل ای که می خواهیم آنرا ایجاد کنیم
کد پی‌اچ‌پی:
CV_FOURCC('P','I','M','1'),// 
فرمت ذخیره سازی
کد پی‌اچ‌پی:
25,//fps 
کد پی‌اچ‌پی:
cvSize(640,480),// 
اندازه تصویر
کد پی‌اچ‌پی:
1// 
رنگی یا تک رنگی بودن تصویر
کد پی‌اچ‌پی:
); 
کد پی‌اچ‌پی:
cvNamedWindow("win",CV_WINDOW_AUTOSIZE);

    for(
int i 01500i++)
    {
        
img=cvQueryFrame(capture);
        
cvSmooth(frame,frame,CV_MEDIAN);
        
cvWriteFrame(writer,frame);
        
cvShowImage("win"frame);
        
cvWaitKey(1);

    }

    return 
0;

_____________
پایان قسمت پنجم

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط hmdhmdhmd ، مهدی ابراهیمی ، siamakb ، itsu88
#6
نابود کردن اشیا
_____________

خوب تا اینجا اصول اولیه opencv را آموختیم، برخی از مهم ترین اشیا را ساختیم، تغییر دادیم و در آخر آنرا در هارد دیسک ذخیره کردیم، حال باید آن اشیا را پس از استفاده نابود کنیم.
در opencv، اصل بر این است که اشیای که توسط خود opencv ساخته می شود، نیازی به آزاد سازی آنها نیست ولی اشیای را که خود آنها را تولید میکنیم، باید آنها را نابود سازیم تا حافظه تخصیص داده شده به آنها آزاد شود.

حال در این قسمت، توابع نابود کننده برنامه ای را که در قسمت ِ پیشین با هم کار کرده بویدم را اظافه می کنیم.

ابتدا برنامه ای را که در قسمت قبل داشتیم را در زیر می نویسیم :
کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc_TCHARargv[])
{
    
IplImage *frame NULL;
    
CvCapture *capture cvCreateCameraCapture(10);

    
CvVideoWriter *writer
کد پی‌اچ‌پی:
writercvCreateVideoWriter(// 
ساختاری برای نوشتن ِ تصویر استفاده می کنیم
کد پی‌اچ‌پی:
"out.avi",// 
فایل ای که می خواهیم آنرا ایجاد کنیم
کد پی‌اچ‌پی:
CV_FOURCC('P','I','M','1'),// 
فرمت ذخیره سازی
کد پی‌اچ‌پی:
25,//fps 
کد پی‌اچ‌پی:
cvSize(640,480),// 
اندازه تصویر
کد پی‌اچ‌پی:
1// 
رنگی یا تک رنگی بودن تصویر
کد پی‌اچ‌پی:
); 
کد پی‌اچ‌پی:
cvNamedWindow("win",CV_WINDOW_AUTOSIZE);

    for(
int i 01500i++)
    {
        
frame=cvQueryFrame(capture);
        
cvSmooth(frame,frame,CV_MEDIAN);
        
cvWriteFrame(writer,frame);
        
cvShowImage("win"frame);
        
cvWaitKey(1);

    return 
0;

اشیایی که در این برنامه ساخته ایم، به شرح زیر است :

1. شئی ای از نوع IplImage که نابود کننده آن cvReleaseImage نام دارد که در نام دامنه cxcore وجود دارد
2. شئی ای از نوع CvCapture که نابود کننده آن cvReleaseCapture نام دارد که در نام دامنه highgui.h وجود دارد
3. شئی ای از نوع CvVideoWriter که نابود کننده آن cvReleaseVideoWriter نام دارد که در نام دامنه highgui.h وجود دارد
4. پنجره ای برای نمایش تصاویر cvNamedWindow که نابود کننده آن cvDestroyWindow نام دارد که در نام دامنه highgui وجود دارد

تمام نام دامنه های بالا بجز نام دامنه cxcore در لیست نام دامنه های برنامه پیشین نوشته ایم، نام دامنه cxcore را هم به لیست نام دامنه های برنامه اظافه می کنیم.

حال برنامه تکمیل شده ما بدین صورت است :

کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int _tmain(int argc_TCHARargv[])
{
    
IplImage *frame NULL;
    
CvCapture *capture cvCreateCameraCapture(10);

    
CvVideoWriter *writer
کد پی‌اچ‌پی:
writercvCreateVideoWriter(// 
ساختاری برای نوشتن ِ تصویر استفاده می کنیم
کد پی‌اچ‌پی:
"out.avi",// 
فایل ای که می خواهیم آنرا ایجاد کنیم
کد پی‌اچ‌پی:
CV_FOURCC('P','I','M','1'),// 
فرمت ذخیره سازی
کد پی‌اچ‌پی:
25,//fps 
کد پی‌اچ‌پی:
cvSize(640,480),// 
اندازه تصویر
کد پی‌اچ‌پی:
1// 
رنگی یا تک رنگی بودن تصویر
کد پی‌اچ‌پی:
); 
کد پی‌اچ‌پی:
cvNamedWindow("win",CV_WINDOW_AUTOSIZE);

    for(
int i 01500i++)
    {
        
frame=cvQueryFrame(capture);
        
cvSmooth(frame,frame,CV_MEDIAN);
        
cvWriteFrame(writer,frame);
        
cvShowImage("win"frame);
        
cvWaitKey(1);

    
cvDestroyWindow("win");
    
cvReleaseVideoWriter(&writer);
    
cvReleaseCapture(&capture);
    
cvReleaseImage(&frame);

    return 
0;


منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط مهدی ابراهیمی ، hmdhmdhmd ، siamakb ، itsu88
#7
آشنایی با تصاویر و ماتریکس
_____________

همانطور که می دانید تصویر از یک آرایه دوبعدی تشکیل می شود و بطور مثال :

* در یک تصویر gray scale هر پیکسل دارای یک مختصات x و y می باشد که مقدار آن بین صفر و 255 متغییر است، مقدار 0 نمایانگر سفید مطلق است و مقدار 255 نمایانگر سیاه مطلق می باشد، حال هر پیکسل می تواند مقداری بین 0 تا 255 را بگیرید.
* در یک تصویر rgb هر پیکسل در سه بایت ذخیره می شود، بایت اول برای blue یا آبی می باشد، بایت دوم برای green یا سبز می باشد و بایت سوم برای red یا قرمز استفاده می شود، حال رنگ حاصل، که ما با چشم مشاهده می کنیم، میانگین این سه رنگ می باشد. در اینجا هم مقادیر هر کدام از این سه رنگ بین 0 تا 256 می باشد.

لازم به ذکر است که توابع نوشته در opencv با زبان c می باشد و ارتباط بین کلاس ها و ارث بری از ++C استفاده شده است.

بنابرین کلاس CvArr به عنوان کلاس پایه می باشد و کلاس CvMat از آن کلاس مشتق شده است و در آخر کلاس IplImage از کلاس CvMat مشتق شده است.


ماتریکس ها را می توان یک بعدی (بردار)، دو بعدی، سه بعدی و چند بعدی می توان ساخت، برای دست یابی به المان های ماتریکس می توان از اشاره گرها و یا ماکروهایی که در opencv در نظر گرفته شده است، استفاده کرد.

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
#8
پیمایش ماتریکس ها
_____________

برای کار با ماتریکس و تصاویر باید کار با اشاره گرها را به یاد داشته باشیم، همچنین باید از نوع داده های مختلف در c و opencv هم مطلع بود.

در کار با اشاره گرها باید به یاد داشته باشیم، که اگر شئی ای را از نوع اشاره گر تعریف کنیم، باید همزمان مقداردهی اولیه شوند، در غیر اینصورت خطای زمان اجرا روی می دهد، دلیلش هم این است که ما به جایی اشاره کرده ایم که وجود خارجی ندارد.

برای مثال مقداردهی های زیر درست است :
کد پی‌اچ‌پی:
CvMat *mat2=cvCreateMat(2,2,CV_32SC1);
    
CvMat mat
ولی مقداردهی زیر نادرست است:
کد پی‌اچ‌پی:
CvMat *mat2


برای تعیین نوع ماتریکس، باید از الگوی زیر استفاده کنیم:
کد پی‌اچ‌پی:
CV_(S|U|F)C

    S 
Signed integer
    U 
Unsigned integer
    F 
Float

    E
.g.: CV_8UC1 means an 8-bit unsigned single-channel matrix,
          
CV_32FC2 means a 32-bit float matrix with two channels
در آخر باید یادآوری کنم که برای دست یابی به مکان اشیا (اشیایی که بصورت اشاره گر تعریف نشده اند)، باید از & (بخوانید: امپرسند) استفاده کرد و برای بدست آوردن مقدار یک اشاره گر باید از * استفاده کرد.

برای مثال، تابع CV_MAT_ELEM مقدار اشیا را به عنوان ورودی میگیرد:
کد پی‌اچ‌پی:
CvMat *mat2=cvCreateMat(2,2,CV_32SC1);
    
CvMat mat
.... // مقدار دهی ماتریکس
کد پی‌اچ‌پی:
int a=CV_MAT_ELEM(mat,int,0,0);
    
int b=CV_MAT_ELEM(*mat2,int,0,0); 
که هر دوی آنها صحیح است.

حال به برخی از توابع کار با توابع می پردازیم:
کد پی‌اچ‌پی:
// a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "cxcore.h"
#include "stdio.h"


int _tmain(int argc_TCHARargv[])
{

    
int vals[]={1,2,3,4};

    
CvMat mat;

    
cvInitMatHeader(
        &
mat,
        
2,
        
2,
        
CV_32SC1,
        
vals);

    
//easy way

    
int a=CV_MAT_ELEM(mat,int,0,0);
    
int b=*((int*)CV_MAT_ELEM_PTR(mat,0,1));

    
//hard way
    
uchar *ptr=cvPtr2D(&mat,0,1);

    
int c=*((int*)cvPtr2D(&mat,0,0));
    
CvScalar scalar1 =cvGet2D(&mat,0,0);

    
//best way
    
for(int rows=0;rows
    
{
        
int *ptr=(int*)(mat.data.ptr+(mat.step*(rows)));

        for(
int cols=0;cols
        
{
            
printf("the value of (%d,%d) is %d. \n",rows,cols,*(ptr++));
           
        }
    }
    
scanf("d");
   
    return 
0;


منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
#9
با عرض سلام و تشکر
ممکنه منو راهنمایی کنین که چه طور از دستورات و اینکه چه چیزی باید در آرگومانهای داخل پرانتز بنویسم باید اطلاع کسب کنم مثلا در cvcanny این آرگومانهایی که با ویرگول از هم جدا شدن چی هستن؟چه جوری تعریف می شن؟کدوماشو می تونیم صرف نظر کنیم؟ و کدوماش لازمن که مقدار دهی بشن؟
cvCanny(const cvArr*imge,cvArr*edges,double threshold1,double threshold2,int aperture_size=3)
پاسخ
سپاس شده توسط siamakb
#10
(07-29-2011, 01:11 PM)hmdhmdhmd نوشته:  با عرض سلام و تشکر
ممکنه منو راهنمایی کنین که چه طور از دستورات و اینکه چه چیزی باید در آرگومانهای داخل پرانتز بنویسم باید اطلاع کسب کنم مثلا در cvcanny این آرگومانهایی که با ویرگول از هم جدا شدن چی هستن؟چه جوری تعریف می شن؟کدوماشو می تونیم صرف نظر کنیم؟ و کدوماش لازمن که مقدار دهی بشن؟
cvCanny(const cvArr*imge,cvArr*edges,double threshold1,double threshold2,int aperture_size=3)


سلام
برای آشنایی با دستورات مختلف می توانید از مراجع مختلف یا سایتهایی شبیه زیر استفاده کنید:
CV Reference Manual
و
http://www.google.com 23

اما در مورد cvcanny باید بگم این متد برای تشخیص لبه استفاده میشه و پارامترهای این متد به شرح زیر هستند:
void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );

image
تصویر ورودی

edges
تصویر جهت ذخیره لبه بدست آمده پس از اجرای متد(حاصل متد)

threshold1
آستانه اول

threshold2
آستانه دوم

aperture_size
ضخامت خط
پاسخ
سپاس شده توسط skyzare ، siamakb ، itsu88


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  طریقه علامت گذاری رنگ های خاص تصویر توسط پردازش تصویر (C++‎ , OpenCV ) rayson 3 1,175 11-29-2014, 02:17 PM
آخرین ارسال: sorena71
Brick آموزش نصب OpenCV در ویژوال استودیو 2010 به همراه یک برنامه ساده مهدی ابراهیمی 53 17,896 08-16-2014, 11:55 PM
آخرین ارسال: matmot
  سوالاتی در زمینه شروع پردازش تصویر با OpenCV diamond87 7 1,064 07-27-2014, 04:28 AM
آخرین ارسال: مهدی ابراهیمی
  opencv industrial board کاوه 1 494 07-18-2014, 04:59 PM
آخرین ارسال: محمدرضا محبیان
  آموزش نصب OpenCV 2.4.7 در ویژوال استودیو 2012 مهدی ابراهیمی 1 405 07-11-2014, 07:39 AM
آخرین ارسال: m_parsa11
  چطور opencv 2.3.1 رو در ویژوال استودیو نصب کنم؟ h0x00i 23 5,359 04-05-2014, 11:17 PM
آخرین ارسال: مهدی ابراهیمی
  سوال:Decode کردن با OpenCV( تشخیص کدهای QR ) rayson 3 535 12-10-2013, 03:31 AM
آخرین ارسال: مهدی ابراهیمی
  تشخیص چهره با OpenCV مهدی ابراهیمی 26 7,335 04-16-2013, 07:44 PM
آخرین ارسال: royall
  مشکل در اجرای OpenCV و پیدا نکردن فایل های PDB؟ alamdar_313 7 1,753 04-12-2013, 06:12 PM
آخرین ارسال: royall
  پیکربندی openCV برای Qt به همراه آموزش alamdar_313 1 1,061 04-11-2013, 05:22 PM
آخرین ارسال: علیـ

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان