ارسال پاسخ 
 
امتیاز موضوع:
  • 2 رأی - میانگین امیتازات : 5
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش openCV
نویسنده پیام
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #1
آموزش openCV
سلام به همه ......

بعد از چند هفته غیبت و نبودن .... می خوام با شروع یک بحث جذاب و کاربردی جبران غیبت کنم

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

در هر حال من شروع می کنم امیدوارم شما هم کمک کنید ...WinkWink

انتظار میره بعد این آموزش ها بتوانیم چهره افراد به کمک وب کم یا دوربین شناسایی کنیم .... مثل تصویر زیر

[تصویر: 13316772541.png]

و در آخر زبان برنامه نویس ما C++ بوده و به کمک کتابخانه openCV2.1 پردازش تصویر خواهیم کرد


راهنمای نصب openCV
برای شروع کار یک تصویر دلخواه می خوای به کمک openCv نمایش بدیم برای این کار باید از کتابخانه "highgui.h" استفاده کنیم

دستور وارد کرد تصویر به این صورته :
کد:
IplImage* img = cvLoadImage( "image.jpg" );
بعد از * یک نام برای عکس وارد شده انتخاب می کنیم
داخل پرانتز و ( "نام فایل و پسوند " ) وارد می کنید تصویر باد در شاخه root برنامه باشه یا آدرس تصویر به صورت کامل وارد کنید ("x:/folder/image.jpg")

بعد از وارد کردن عکس حالا احتیاج به پنجره ای داریم که تصویر برای ما نمایش بده جهت ایجاد این پنجره از دستور زیر استفاده می کنیم :

کد:
cvNamedWindow( "name windows", CV_WINDOW_AUTOSIZE );

در قسمت name windows نامی دلخواه برای هدر پنجره انتخاب می کنیم ، گذاشتنCV_WINDOW_AUTOSIZE در انتهای کد به صورت دلخواه می باشد

بعد از وارد کردن عکس و ایجاد پنجره حالا باید این عکس را در این پنجره به نمایش در آوریم باری این کار از دستور زیر استفاده می کنیم :

کد:
cvShowImage("name windows", img);

در اینجا باید حتما نام پنجره که ایجاد کرده اید را وارد کرده و بعد از آن نام تصویر را وارد کیند

برنامه پایانی شما به این صورت خواهد بود :

کد:
#include "stdafx.h"

#include "highgui.h"



int _tmain(int argc, _TCHAR* argv[])
{
    IplImage* img = cvLoadImage( "image.jpg" );
    cvNamedWindow( "name windows", CV_WINDOW_AUTOSIZE );
    cvShowImage("name windows", img);
    cvWaitKey(0);
// از این دستور برای ایجاد وقفه در برنامه استفاده می کنیم تا زمانی که کلیدی در صفحه کلید فشرده نشود تصویر نمایش داده خواهد شود در صورت وارد کرد عدد در داخل پرانتز زمان برحسب میلی ثانیه خواهد بود

    return 0;
}

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۲۴-اسفند-۱۳۹۰ ۱۳:۳۹:۰۶، توسط h0x00i.)
۲۴-اسفند-۱۳۹۰ ۰۱:۵۳:۱۸
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : Pardazesh-Gar, sharin, salehjg, ha_60, ROBOTICS, makintajh, mhpc2009, joker, bitaroos, behzady
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #2
RE: آموزش openCV
طی آموزش قبلی نحوه نمایش یک تصویر را آموزش دادیم در این بخش قصد داریم یک فیلم را به کمک openCV نمایش دهیم برای این کار باید هر فریم را جدا جدا مانند یک تصویر نمایش بدیم .برای شرو برای وارد کردن یک ویدئو به برنامه از دستور زیر استفاده می کنیم :
کد:
CvCapture *capture=cvCreateFileCapture("video.avi");
ویدئو هایی که می توانید به کمک open CV نمایش بدید با ید به فرمت avi باشند

قبل نمایش فیلم باید از برخی خصوصیات فیلم آگاه باشیم مانند سرعت فریم ها یا (FPS) که در نمایش فیلم نقش مهمی دارد با دستور زیر برخی از خصوصیات فیلم را می توانیم استخراج کنیم

کد:
int fps=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
خرجی این دستور به صورت عددی (int) بوده capture نامی است که به ویدئوی خود اختصاص دادیم و خصوصیات آن برای ما بر می گردد
CV_CAP_PROP_FPS با این دستور خصوصیایت مربوط به FPS تصویر به خروجی بر می گردد به جای این دستور می توانید از دستور های زیر برای خصوصیات دیگر استفاده کنید :

[تصویر: 13317545971.png]

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

کد:
;IplImage *frame

حال فریم ها را تک به تک وارد این متغییر می کنیم برای ان کار باید از دستور زیر جهت واکاوی تصویر استفاده کنیم

کد:
frame=cvQueryFrame(capture)

capture نام متغیر ویدئویی ما می باشد .

حال به کمک 2 دستوری که قبلا آموزش دادیم یک پنجره ایجاد می کنیم و تصویر فریم ها را نمایش می دهیم :

کد:
cvNamedWindow("video");
cvShowImage("video",frame);

در آخر جهت نمایش فریم ها به صورت پست سر هم از یک حلقه while استفاده می کنیم برای تاخیر برای نمایش هر فریم از دستور cvWaitKey(fps); که قبلا توضیح داده شده استفاده می کنیم مقدار تاخیر مساوی تعداد فریم ها در یک ثانیه خواهد بود .

برنامه کابل به صورت زیر خواهد بود


کد:
#include "stdafx.h"
#include "highgui.h"

int _tmain(int argc, _TCHAR* argv[])
{

    CvCapture *capture=cvCreateFileCapture("video.avi");

    int fps=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);

    
    IplImage *frame;
    cvNamedWindow("video");
    cvNamedWindow("window");

    while(1)
    {
        frame=cvQueryFrame(capture);
        cvShowImage("window",frame);
        cvWaitKey(fps);
        if(!frame)break;
    }
    return 0;
}

دستور شرطی if در پایان برای خروج از حلقه زمان پایان ویدئو می باشد ..

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
۲۴-اسفند-۱۳۹۰ ۲۳:۳۳:۴۵
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, Pardazesh-Gar, salehjg, makintajh, mhpc2009, ROBOTICS, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #3
RE: آموزش openCV
بعد از نمایش یک ویدئو به کمک openCv قصد داریم با یک دستگاه ورودی مانند وب کم یا هندیکم یا گوشی و... تصویر پردازش کنیم openCV امکان این امر به ما میده که با یک خط دستور این عمل را انجام بدیم برای وارد کردن یک تصویر زنده به کمک openCv(از این به بعد هرجا خواستم بنویسم openCV می نویسم OCV) از دستور زیر استفاده می کنیم :

کد:
CvCapture* capture = cvCreateCameraCapture(0);

شما می توانید هر تعداد دوربین به OCV متصل کنید کافی است مقدار مربوط به هر وبکم را داخل پرانتز قرار دهید .

باقی کار مانند برنامه قبلی می باشد باید تک تک فریم ها را به صورت جدا جدا و پشت سرهم نمایش دهید


اعمال فیلتر در تصاویر

فیلتر ها نقش بسیار مهمی در کشف اجسام ، حروف یا آشکار سازی تصاویر دارند در OCV شما توانایی اعمال انواع فیلتر بروی تصاویر خود دارید که به برسی برخی از این فیلتر ها در این تاپیک می پردازیم : (لازم به ذکر می باشد که عمل فیلترینگ یکی از مهمترین بخش های پردازش تصویر می باشد)
کد:
cvSmooth(image,dst,نوع فیلتر اعمالی)

در این دستور ما می توانیم انواع فیلتر های زی را به تصوری اعمال کنیم :
[تصویر: 13319029711.png]

در تصویر خصوصیات هر کدام جداگانه توضیح داده شده است

در برنامه زیر قصد درایم فیلتر bulr را به تصویر وارد شده اعمال کنیم

کد:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
int _tmain(int argc, _TCHAR* argv[])
{
    IplImage*img=cvLoadImage("pic1.jpg");
    cvNamedWindow("PIC");
    cvNamedWindow("fliter");
    cvShowImage("PIC",img);
    cvSmooth(img,img,CV_BLUR);

    cvShowImage("fliter",img);
    cvWaitKey();
    return 0;
}

تصویر ورودی و خروجی به شکل زیر می باشد :

[تصویر: 13319047951.jpg]



جهت تغییر حالت تصاویر از RGB به فرمت های رنگی دیگر یا بالعکس از کد زیر استفاده می کنیم

کد:
cvCvtColor(img1,img2,فرمت جدید)
طبق جدول زیر می توانید تغیر فرمت اعمال کنید :

[تصویر: 13319064091.jpg]

[تصویر: 13319064092.jpg]

[تصویر: 13319064093.jpg]

لبه یابی گامی بزرگ جهت کشف object ها در تصویر می باشد در OCV با یک دستور کوچک شما قادر خواهید بود لبه های object ها را پیدا کنید :
دستور :

کد:
void cvCanny(
const CvArr* img,
CvArr* edges,
double lowThresh,
double highThresh,
int apertureSize = 3
);

جهت اعمل فیلتر باید یک تصویر همانند تصویر اولیه دارای یک کانال تولید کنیم جهت این کار از دستور زیر استفاده می کنیم :

کد:
IplImage *dst=cvCreateImage(cvGetSize(img),img->depth,1);
در این دستور تصویر dst هم اندازه img از جنس img و با یک کانال تولید می شود


پس برای لبه یابی یک تصویر به صورت زی عمل می کنیم :
1. یک تصویر از جنس و اندازه تصویر اصلی ایجاد می کنیم .
2. فرمت رنگی تصویر ورودی را در صورت RGB بودن به فرمتی دیگر مانند grayscale تبدیل می کنیم (CV_RGB2GRAY)
3. حالا از دستور cvCanny استفاده می کنم و مقدار های صحیح را به آن اعمال می کنیم تا بهترین لبه یابی را برای ما کشف کند



مثال :

کد:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
int _tmain(int argc, _TCHAR* argv[])
{
    IplImage*img=cvLoadImage("pic1.jpg");
    IplImage*dst=cvCreateImage(cvGetSize(img),img->depth,1);
    cvNamedWindow("PIC");
    cvNamedWindow("canny");
    cvShowImage("PIC",img);
    cvSmooth(img,img,CV_MEDIAN);
    cvCvtColor(img,dst,CV_RGB2GRAY);
    cvCanny(dst,dst,10,100,3);
    cvShowImage("canny",dst);
    cvWaitKey();
    return 0;
}

تصویر خروجی :

[تصویر: 13319074471.jpg]

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۲۶-اسفند-۱۳۹۰ ۱۷:۴۶:۳۴، توسط h0x00i.)
۲۶-اسفند-۱۳۹۰ ۱۶:۴۷:۱۰
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, lord_viper, salehjg, Pardazesh-Gar, makintajh, mhpc2009, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #4
RE: آموزش openCV
خوب در این قسمت قصد داریم به ایجاد یک trackbar به کمک OCV بپردازیم برای ایجاد یک trackbar در OCV با استیل زیر اقدام کنیم :

کد:
int cvCreateTrackbar(
const char* trackbar_name,
const char* window_name,
int* value,
int count,
CvTrackbarCallback on_change
);

همینطور که می بینید خروجی این تابع از نوع عددی int میباشد این دستور به 5 بخش تقسیم می شود که به توضیح هر بخش می پردازیم
1. نامی که برای Trackbar تعیین می کنیم
2. نام پنجره ای که Trackbar در آن به نمایش در می آید
3.متغییر از نوع int که مقدار برگشتی به ان نسبت داده می شود
4.در این قسمت ما میزان حرکت Trackbar را تعیین می کنیم که مقدار آن به value نسبت داده می شود
5.تابع برگشتی Trackbar می باشد


مثال :
در این مثال ما بر روی یک تصویر با استفاده از Trackbar فیلتر های مختلفی را اعمال می کنیم :

برنامه : از برنامه نترسید یکم زیاده و دستورها و توابع جدید توش هست ولی خیلی آسون در ادامه به شرح هر کدام می پردازیم این برنامه فقط جنبه نمایش نوع کار کرد Trackbar را داره
کد:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"//only for cvReleaseImage function
int g_switch_value = 0;
int fliter = 0;
int lastfilterInt = -1;

void callback( int a ){
    fliter = a;
}

int _tmain(int argc, _TCHAR* argv[])
{
    const char* name = "IRANLED --> h0x00i";
    IplImage* img = cvLoadImage( "iranled.jpg" );
    IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );

    cvNamedWindow( name, 1 );
    cvShowImage(name, out);

    
    // Other Variables
    CvPoint seed_point = cvPoint(305,195);
    CvScalar color = CV_RGB(250,0,0);

    // Create trackbar
    cvCreateTrackbar( "fliter", name, &g_switch_value, 5, callback );

    while( 1 ) {
        switch( fliter ){
            case 0:
                cvSmooth( img, out, CV_BLUR, 7, 7 );
                
                break;
            case 1:
                cvSmooth( img, out, CV_GAUSSIAN, 7, 7 );
                
                break;
            case 2:
                cvSmooth( img, out, CV_MEDIAN, 7, 7 );
                
                break;
            case 3:
                cvErode( img, out, NULL, 1);
                
                break;
            case 4:
                cvDilate( img, out, NULL, 1);
                
                break;
            case 5:
                cvFloodFill( out, seed_point, color, cvScalarAll(5.0), cvScalarAll(5.0), NULL, 4, NULL );
                
                break;
        }
        if(fliter != lastfilterInt){
            cvShowImage(name, out);
            lastfilterInt = fliter;
        }
        if( cvWaitKey( 15 ) == 27 )
            break;
    }

    cvReleaseImage( &img );
    cvReleaseImage( &out );
    cvDestroyWindow( name );
    return 0;
}

تصویر خروجی
:
فیلتر : CV_BLUR
[تصویر: 13322685331.jpg]
فیلتر :CV_GAUSSIAN
[تصویر: 13322685332.jpg]
فیلتر :CV_MEDIAN
[تصویر: 13322685333.jpg]
Erode با مقدار NULL
[تصویر: 13322685344.jpg]
Dilate با مقدار NULL
[تصویر: 13322685345.jpg]
FloodFill (red)
[تصویر: 13322685346.jpg]

ادامه دارد ....

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۱-فروردين-۱۳۹۱ ۲۲:۱۳:۵۸، توسط h0x00i.)
۱-فروردين-۱۳۹۱ ۲۲:۰۷:۴۹
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, Pardazesh-Gar, makintajh, lord_viper, salehjg, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #5
RE: آموزش openCV
نکته مهم :

منو ها و دکمه ها توی پردازش تصویر کار بردی ندارن، ولی من قصدم اینکه با این روش در آخر آموزش یک موتور کنترل کنم ، پس لازم یک پنل هم داشته باشم پس باید اینا رو هم بگم . ;)

اینم رابط این تاپیک به این بخش :)

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۲-فروردين-۱۳۹۱ ۰۰:۴۴:۲۲، توسط h0x00i.)
۲-فروردين-۱۳۹۱ ۰۰:۴۲:۰۱
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #6
RE: آموزش openCV
نمایش متن و خطوط برروی تصویر :


یکی از کاربردی ترین بخش های کار ما ترسیم خطوط و نمایش متن بر روی تصویر می باشد برای این کار ما از دستور و توابع زیر استفاده می کنیم.

ترسیم یک خط :

دستور کلی رسم یک خط به صورت زیر می باشد :
کد:
void cvLine(
CvArr* array,
CvPoint pt1,
CvPoint pt2,
CvScalar color,
int thickness = 1,
int connectivity = 8
);

array تصویری است که می خواهیم بر روی آن خط را رسم کنیم
pt1,pt2 مختصات نقطه شروع و پایان خط می باشند
color رنگ خط
thickness ضخامت
connectivity نقطه اتصال می باشد

خوب قبل از اینکه شما از این تابع استفاده کنید باید با مفهم CvPoint ،CvScalar آشنا شوید

منظور از CvScalar رنگ می باشد که با به این صورت پیکر بندی می شود

کد:
CvScalar red = CV_RGB(250,0,0);
CvScalar blue= CV_RGB(0,0,250);
CvScalar green= CV_RGB(0,250,0);
همانطور که می بینید متغییری که با این تابع معرفی می شود با سه مقدار RGB از 0 تا 255 تعریف می شود

منظور از CvPoint مختصات نقطه تک بعدی (2D) بر روی تصویر می باشد و با دو مقدار x , y تعریف می شود
کد:
CvPoint pt1 = cvPoint(250,60);
مقدار x , y بستگی به سایز تصویر شما دارند که در صورت بزرگ تر بودن نمایش داده نمی شوند

مثال :

کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage*img = cvLoadImage("1.jpg");
    cvNamedWindow("test",1);
    CvPoint pt1 =cvPoint(50,210);
    CvPoint pt2 =cvPoint(200,100);
    CvScalar red =CV_RGB(250,0,0);
    int thickness =4;
    int connectivity=1;

    cvLine(img,pt1,pt2,red,thickness,connectivity);
    cvShowImage("test",img);
    cvWaitKey();
    return 0;
}

تصویر خروجی :
[تصویر: 13326669861.png]

ادامه دارد
ترسیم دایره :

دستور کلی ترسیم داره به صورت زیرمی باشد :
کد:
void cvCircle (
CvArr* array,
CvPoint center,
int radius,
CvScalar color,
int thickness = 1,
int connectivity = 8
);

همانطور که مشاهد می کنید ساختار کلی دستور مانند دستور نمایش خط می باشد
شرح کلی برنامه اینگونه می باشد که ما یک نقطه را به عنوان مرکز داره با استفاده از CvPoint تعیین می کنیم و مقدار شعاع مورد نظر مون به داره می دهیم .

این دستور در مثال قبلی اعمال می کنیم :

کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage*img = cvLoadImage("1.jpg");
    cvNamedWindow("iranled --> h0x00i",1);
    CvPoint pt1 =cvPoint(50,210);
    CvPoint pt2 =cvPoint(200,100);
    CvScalar red =CV_RGB(250,0,0);
    CvScalar blue =CV_RGB(0,0,110);
    int thickness =4;
    int connectivity=1;
    int radius = 35;



    cvCircle(img,pt2,radius,blue,thickness,connectivity);
    cvLine(img,pt1,pt2,red,thickness,connectivity);
    cvShowImage("iranled --> h0x00i",img);
    cvWaitKey();
    return 0;
}

تصویر خروجی :
[تصویر: 13326695241.png]

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۶-فروردين-۱۳۹۱ ۱۳:۲۶:۵۴، توسط h0x00i.)
۶-فروردين-۱۳۹۱ ۱۲:۴۴:۵۵
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, salehjg, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #7
RE: آموزش openCV
نمایش متن برروی تصویر :

یکی از مهم ترین و بهترین روشها که ما می توانیم به کمک آن اطلاعاتی را به کاربر یا اپراتور انتقال دهیم استفاده از متن می باشد openCV به راحتی این امکان را برای ما محیا کرده است .
برای نمایش متن ما احتیاج به معرفی فونت برای نمایش داریم openCV به صورت پیش فرض 8 فونت برای ما محیا کرده است برای پیکر بندی فونت به این صورت عمل می کنیم :

اول یک متغییر به عنوان فونت تعریف می کنیم
کد:
CvFont font;
حال شروع به پیکر بندی و تعیین خصوصیات فونت می کنیم

کد:
void cvInitFont(
CvFont* font,
int font_face,
double hscale,
double vscale,
double shear = 0,
int thickness = 1,
int line_type = 8
);
1.نام فونت که قبلا تعریف کردیم
2.یکی از 8 فونت پیش فرض openCV
[تصویر: 13326704021.png]

[تصویر: 13326704691.png]


3,4.مقیاس فونت از نظر طول و عرض این متغییرها باید از نوع double
5.فاصله بین کلمات این متغییر باید از نوع double
6.ضخامت حروف

بعد از پیکر بندی فونت حال باید با استفاده از دستور زیر متن مورد نظرمون روی تصویر نمایش بدیم :

کد:
void cvPutText(
CvArr* img,
const char* text,
CvPoint origin,
const CvFont* font,
CvScalar color
);
1. تصویری که متن بروی آن ضاهر می شود
2. متن مورد نظرمون که باید در متغییری از نوع char به صورت const ذخیره شوده باشد
3. مختصات نقطه نمایش
4. فونت
5.رنگ

مثال :
کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc, _TCHAR* argv[])
{
    IplImage*img = cvLoadImage("1.jpg");
    cvNamedWindow("iranled --> h0x00i",1);
    CvPoint pt1 =cvPoint(50,210);
    CvPoint pt2 =cvPoint(200,100);
    CvScalar red =CV_RGB(250,0,0);
    CvScalar blue =CV_RGB(0,0,110);
    int thickness =4;
    int connectivity=1;
    int radius = 35;
    double hscale=2;
    double vscale=2;
    double shear=1;
    const char* text="IRANLED-->h0x00i";
    const char* text1="www.IRANLED.com";
    CvFont font1;
    cvInitFont(&font1,CV_FONT_HERSHEY_PLAIN,hscale,vscale,shear,thickness,8);


    cvCircle(img,pt2,radius,blue,thickness,connectivity);
    cvLine(img,pt1,pt2,red,thickness,connectivity);
    cvPutText(img,text,pt1,&font1,blue);
    cvPutText(img,text1,cvPoint(53,235),&font1,blue);
    cvShowImage("iranled --> h0x00i",img);
    cvWaitKey();
    return 0;
}

تصویر خروجی :
[تصویر: 13326713481.png]

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
۶-فروردين-۱۳۹۱ ۱۳:۵۷:۱۵
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, lord_viper, salehjg, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #8
RE: آموزش openCV
نمایش Histogram تصویر :


هیستگرام تصویر یکی از کاربردی ترین و مهمترین بخشها در پردازش تصویر می باشد با استفاده از هیستگرام ما توانایی این را پیدا خواهیم کرد که مکان اشیا را در تصاویر پیدا کنیم با توجه به تصویر زیر می توانید به درک بهتری از هیستگرام برسید :»

[تصویر: 13327469481.png]

همنطور که می بینید محل تجمع نقاط دارای بیشترین مقدار در نمودار خطی ما می باشد که بیان گر تجمع نقاط در آن مکان ها می باشد .

برای درک بهتر از یک مثال عملی جهت ترسیم هیستگرام یک تصویر استفاده می کنیم

مثال :
کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "stdio.h"


int _tmain(int argc, _TCHAR* argv[])
{


IplImage*img = cvLoadImage("1.jpg");

IplImage *dst= cvCreateImage(cvGetSize(img),img->depth,1);



cvCvtColor( img, dst, CV_BGR2GRAY );



cvEqualizeHist( dst, dst );



CvHistogram* hist;

int bins = 256;
int hsize[] = {bins};

float max_value = 0, min_value = 0;

float value;
int normalized;

float xranges[] = { 0, 256 };
float* ranges[] = { xranges };

IplImage* planes[] = { dst };

hist = cvCreateHist( 1, hsize, CV_HIST_ARRAY, ranges,1);

cvCalcHist( planes, hist, 0, NULL);

cvGetMinMaxHistValue( hist, &min_value, &max_value);

printf( "min: %f, max: %f\n" , min_value, max_value);

IplImage* imgHistogram = cvCreateImage(cvSize(bins, 50),8,1);

cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50),CV_RGB(255,255,255),-1);

for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D( hist, i);
normalized = cvRound(value*50/max_value);
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0));}



cvNamedWindow("Histogram",1);
cvShowImage( "Histogram", imgHistogram );

cvNamedWindow( "Hough_Circles_Detect", 1 );

cvShowImage( "Hough_Circles_Detect", img );

cvWaitKey();



return 0;
}

حال به تشریح این مثال می پردازیم
کد:
IplImage*img = cvLoadImage("1.jpg");

IplImage *dst= cvCreateImage(cvGetSize(img),img->depth,1);



cvCvtColor( img, dst, CV_BGR2GRAY );

در این قسمت تصویر مورد نظر خودمون وارد برنامه می کنیم و یک تصویر هم اندازه و به صورت تک کاناله جهت اعمال فیلتر می سازیم

در اولین مرحله پردازش تصویر را از حالت RGB به GRAY (خاکستری) تبدیل می کنیم

کد:
cvEqualizeHist( dst, dst );
آماده سازی تصویر جهت عمل هیستگرام تصویری که در این بخش وارد میشود باید به صورت تک کاناله و 8 بیتی باشد
کد:
CvHistogram* hist;

int bins = 256;
int hsize[] = {bins};

float max_value = 0, min_value = 0;

float value;
int normalized;

float xranges[] = { 0, 256 };
float* ranges[] = { xranges };
بردار هیستگرام را تعریف می کنیم ،
تعیین اندازه برای هیستگرام
بیشترین و کمترین مقدار هیستگرم
میزان دامنه (تعداد)نمایش ستونها در محور x

کد:
IplImage* planes[] = { dst };

hist = cvCreateHist( 1, hsize, CV_HIST_ARRAY, ranges,1);
// محاسبه مقادیر هیستگرام
cvCalcHist( planes, hist, 0, NULL);
cvGetMinMaxHistValue( hist, &min_value, &max_value);
//نمایش مقادیر
printf( "min: %f, max: %f\n" , min_value, max_value);
//ساخت تصویر جهت نمایش بردار هیستگرام به صورت8 بیتی و تک کاناله
IplImage* imgHistogram = cvCreateImage(cvSize(bins, 50),8,1);
//ترسیم مستطیل جهت قاب کلی تصویر
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50),CV_RGB(255,255,255),-1);

//این حلقه جهت نمایش پشت سر هم ستون های هیستگرام

for(int i=0; i < bins; i++){
//محاسبه هیستگرام
value = cvQueryHistValue_1D( hist, i);
normalized = cvRound(value*50/max_value);
//نمایش خط
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0));}

//نمایش هیستگرام و تصویر اصلی
cvNamedWindow("Histogram",1);
cvShowImage( "Histogram", imgHistogram );

cvNamedWindow( "Hough_Circles_Detect", 1 );

cvShowImage( "Hough_Circles_Detect", img );

cvWaitKey();

خروجی :
[تصویر: 13327498471.jpg]

در قسمت بعدی اولین گام برای کشف اشیا در تصاویر و ویدئو ها خواهیم برداشت Wink

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۷-فروردين-۱۳۹۱ ۱۱:۴۶:۳۴، توسط h0x00i.)
۷-فروردين-۱۳۹۱ ۱۱:۱۶:۳۴
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, salehjg, bitaroos, behzady, babyy, jaber125
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #9
RE: آموزش openCV
پیدا کردن شکل دایره :

در این قسمت قصد ما پیدا کرد دایره در تصویر می باشد در این مرحله ما فقط اقدام به پیدا کرد دایره و کشیدن خط قرمز دور آن خواهیم کرد برای این کار از روش های زیادی می شود استفاده کرد اما ما فعلا آسان ترین این روش هارا شرح می دهیم :
روش HoughCircles (هاف دایرهای)

کد:
CvSeq* cvHoughCircles(
CvArr* image,
void* circle_storage,
int method,
double dp,
double min_dist,
double param1 = 100,
double param2 = 300,
int min_radius = 0,
int max_radius = 0
);

شکل کلی این دستور به این صورته
1. عکسی که باید دایره توی اون پیدا بشه این تصویر یاد به صورت 8 بیتی و تک کانال باشه
2. یک حافظه از مموری(CvMemStorage)
3.متود کشف دایره
[تصویر: 13327616261.png]
4.؟؟؟ بیشتر به دقت در کشف ربط داره هرچی کمتر باشه بهتره ولی صفرش نکنید ???
5.6.سایز محیط اکتشاف
7.8.بیشترین و کمترین شعاع دایره

وقتی شما از این دستور استفاده می کنید یک آرایه از جنس float و با نام p*به برنامه شما اضافه می شود که دارای 3 اندیس می باشد و مختصات و شعاع دایره شما را در خود ذخیره می کند شما باید به این صورت از این آرایه استفاده کنید :

کد:
float *p;

p=(float*)cvGetSeqElem( circles, 0);
حالا می تونید با یک دستور دایره یک دایره در مختصات داده شده رسم کنید
مثال :

کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "stdio.h"


int _tmain(int argc, _TCHAR* argv[])
{

IplImage*img = cvLoadImage("2.jpg");

IplImage *dst= cvCreateImage(cvGetSize(img),img->depth,1);





cvCvtColor( img, dst, CV_BGR2GRAY );

cvSmooth(dst, dst, CV_GAUSSIAN, 9,9,0,0);



CvMemStorage* storage = cvCreateMemStorage(0);

CvSeq* circles = cvHoughCircles(dst, storage,CV_HOUGH_GRADIENT, 1,dst->height/2,dst->height/2,2, 25, 65);




float *p;

p=(float*)cvGetSeqElem( circles, 0);

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(255,0,0), 5, 2, 0 );





cvNamedWindow( "iranled", 1 );

cvShowImage( "iranled", img );

cvWaitKey();



return 0;
}


خروجی برنامه :
[تصویر: 13327626081.png]
[تصویر: 13327621311.png]

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۷-فروردين-۱۳۹۱ ۱۵:۱۸:۳۰، توسط h0x00i.)
۷-فروردين-۱۳۹۱ ۱۵:۱۰:۴۳
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : sharin, Pardazesh-Gar, salehjg, bitaroos, behzady, babyy
h0x00i آفلاین
مدیر بازنشسته
*****

ارسال ها: 972
تاریخ عضویت: دي ۱۳۸۹

تشکرها : 2862
( 2364 تشکر در 939 ارسال )
ارسال: #10
RE: آموزش openCV
توی این تاپیک یه برنامه کامل برای پیدا کردن دایره از طریق وب کم آماده کردم که می تونید به وسیله کنترل پنل تنظیمات خودتون به تصویر اعمال کنید

در ضمن این برنامه چکیده ای از آموزش های بالاست که توی یک برنامه ارائه شده :

کد:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "stdio.h"
#include "math.h"

int biit=50;
int biit1=100;
double low=10;
double high=10;
int smooth=2;
int num0,num1=0,num2,num3,num4;

void switch_num(int n){

biit=n;
}
void switch_num1(int n){

biit1=n;
}
void switch_num2(int n){

low=n;
}
void switch_num3(int n){

high=n;
}
void switch_num4(int n){

smooth=n;
}

int _tmain(int argc, _TCHAR* argv[])
{



const char* text = "Circles";

const char* text1 = "Find Circles";

double hscale = 1.0;

double vscale = 0.8;

double shear = 0.2;

int thickness2 = 1;

int line_type = 8;

CvPoint pt = cvPoint(20,20);

CvScalar blue = CV_RGB(0,0,250);

CvFont font1;

cvInitFont(&font1,2,hscale,vscale,shear,thickness2,line_type);

static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},

{{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}},{{255,0,0}} };





CvCapture *capture=cvCreateCameraCapture(1);

IplImage *img=cvQueryFrame(capture);

IplImage *dst= cvCreateImage(cvGetSize(img),img->depth,1);

while(1){


//panel

cvCreateTrackbar("threshold 1","panel",&num0,200,switch_num);

cvCreateTrackbar("threshold 2","panel",&num1,7,switch_num1);

cvCreateTrackbar("canny low","panel",&num2,255,switch_num2);

cvCreateTrackbar("canny high","panel",&num3,255,switch_num3);

cvCreateTrackbar("Smooth","panel",&num4,5,switch_num4);



img=cvQueryFrame(capture);

cvCvtColor( img, dst, CV_BGR2GRAY );


cvSmooth(dst, dst, smooth, 9,9,0,0);

cvEqualizeHist( dst, dst );




//نمایش هیستگرام

CvHistogram* hist;

int bins = 256;
int hsize[] = {bins};

float max_value = 0, min_value = 0;

float value;
int normalized;

float xranges[] = { 0, 256 };
float* ranges[] = { xranges };

IplImage* planes[] = { dst };

hist = cvCreateHist( 1, hsize, CV_HIST_ARRAY, ranges,1);

cvCalcHist( planes, hist, 0, NULL);

cvGetMinMaxHistValue( hist, &min_value, &max_value);

printf( "min: %f, max: %f\n" , min_value, max_value);

IplImage* imgHistogram = cvCreateImage(cvSize(bins, 100),8,3);

cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,100),CV_RGB(255,255,255),-1);

for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D( hist, i);
normalized = cvRound(value*50/max_value);
cvLine(imgHistogram,cvPoint(i,100), cvPoint(i,100-normalized), colors[i%9],2);}







IplImage* graybin = cvCreateImage(cvGetSize(dst),dst->depth,1);

IplImage* bit = cvCreateImage(cvGetSize(dst),dst->depth,1);

IplImage* canny = cvCreateImage(cvGetSize(dst),dst->depth,1);

cvThreshold(dst,graybin,min_value+1,max_value+5,CV_THRESH_BINARY);

cvThreshold(dst,bit,biit,200,biit1);

cvCanny(bit,canny,low,high,3);

cvDilate( graybin, graybin, NULL, 5);





CvMemStorage* storage = cvCreateMemStorage(0);

CvSeq* circles = cvHoughCircles(canny, storage,CV_HOUGH_GRADIENT, 1,dst->height/2,dst->height/2,2, 30, 100);

printf( "circles: %i\n" , circles);

float *p;

p=(float*)cvGetSeqElem( circles, 0);

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(255,0,0), 2, 2, 0 );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])),2,CV_RGB(0,255,0), 5, 2, 0 );

printf( "circles: %i\n p[%f , %f , %f ]" , circles,p[0],p[1],p[2]);

cvPutText(img,text,cvPoint(cvRound(p[0]),cvRound(p[1])),&font1,colors[5]);

cvPutText(img,text1,pt,&font1,CV_RGB(255,0,0));

cvSaveImage( "opt.bmp" ,img);

cvNamedWindow("Histogram",1);
cvShowImage( "Histogram", imgHistogram );

cvNamedWindow( "panel" , 1 );

cvNamedWindow( "Threshold" , 1 );

cvShowImage( "Threshold" , bit );

cvNamedWindow( "canny", 1 );

cvShowImage( "canny", canny );

cvNamedWindow( "img", 1 );

cvShowImage( "img", img );

cvWaitKey(1);

}




return 0;
}

تصویر خروجی :

http://www.uppp.ir/uploads/13331013231.png

فروش مقالات ISI در صورت تمایل موضوع مقاله ارسال کنید
<<برای مدیران ایران ویج رایگان>>
(آخرین ویرایش در این ارسال: ۱۱-فروردين-۱۳۹۱ ۱۳:۲۹:۲۴، توسط h0x00i.)
۱۱-فروردين-۱۳۹۱ ۱۳:۲۳:۲۰
مشاهده وب سایت کاربر یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
تشکر شده توسط : رسول, salehjg, Pardazesh-Gar, bitaroos, behzady, babyy
ana_ana آفلاین
تازه وارد

ارسال ها: 4
تاریخ عضویت: تير ۱۳۹۱

تشکرها : 0
( 0 تشکر در 0 ارسال )
ارسال: #11
RE: آموزش openCV
(۱-فروردين-۱۳۹۱ ۲۲:۰۷:۴۹)h0x00i نوشته شده توسط:  خوب در این قسمت قصد داریم به ایجاد یک trackbar به کمک OCV بپردازیم برای ایجاد یک trackbar در OCV با استیل زیر اقدام کنیم :

کد:
int cvCreateTrackbar(
const char* trackbar_name,
const char* window_name,
int* value,
int count,
CvTrackbarCallback on_change
);

همینطور که می بینید خروجی این تابع از نوع عددی int میباشد این دستور به 5 بخش تقسیم می شود که به توضیح هر بخش می پردازیم
1. نامی که برای Trackbar تعیین می کنیم
2. نام پنجره ای که Trackbar در آن به نمایش در می آید
3.متغییر از نوع int که مقدار برگشتی به ان نسبت داده می شود
4.در این قسمت ما میزان حرکت Trackbar را تعیین می کنیم که مقدار آن به value نسبت داده می شود
5.تابع برگشتی Trackbar می باشد


مثال :
در این مثال ما بر روی یک تصویر با استفاده از Trackbar فیلتر های مختلفی را اعمال می کنیم :

برنامه : از برنامه نترسید یکم زیاده و دستورها و توابع جدید توش هست ولی خیلی آسون در ادامه به شرح هر کدام می پردازیم این برنامه فقط جنبه نمایش نوع کار کرد Trackbar را داره
کد:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"//only for cvReleaseImage function
int g_switch_value = 0;
int fliter = 0;
int lastfilterInt = -1;

void callback( int a ){

fliter = a;
}

int _tmain(int argc, _TCHAR* argv[])
{

const char* name = "IRANLED --> h0x00i";

IplImage* img = cvLoadImage( "iranled.jpg" );

IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );


cvNamedWindow( name, 1 );

cvShowImage(name, out);




// Other Variables

CvPoint seed_point = cvPoint(305,195);

CvScalar color = CV_RGB(250,0,0);


// Create trackbar

cvCreateTrackbar( "fliter", name, &g_switch_value, 5, callback );


while( 1 ) {


switch( fliter ){



case 0:




cvSmooth( img, out, CV_BLUR, 7, 7 );









break;



case 1:




cvSmooth( img, out, CV_GAUSSIAN, 7, 7 );









break;



case 2:




cvSmooth( img, out, CV_MEDIAN, 7, 7 );









break;



case 3:




cvErode( img, out, NULL, 1);









break;



case 4:




cvDilate( img, out, NULL, 1);









break;



case 5:




cvFloodFill( out, seed_point, color, cvScalarAll(5.0), cvScalarAll(5.0), NULL, 4, NULL );









break;


}


if(fliter != lastfilterInt){



cvShowImage(name, out);



lastfilterInt = fliter;


}


if( cvWaitKey( 15 ) == 27 )



break;

}


cvReleaseImage( &img );

cvReleaseImage( &out );

cvDestroyWindow( name );

return 0;
}

تصویر خروجی
:
فیلتر : CV_BLUR
[تصویر: 13322685331.jpg]
فیلتر :CV_GAUSSIAN
[تصویر: 13322685332.jpg]
فیلتر :CV_MEDIAN
[تصویر: 13322685333.jpg]
Erode با مقدار NULL
[تصویر: 13322685344.jpg]
Dilate با مقدار NULL
[تصویر: 13322685345.jpg]
FloodFill (red)
[تصویر: 13322685346.jpg]

ادامه دارد ....

با سلام من وقتی این برنامه را اجرا می کنم یک اررور دارم عکسشو براتون میذارم میشه بگید مشکل از کجاست؟            
(آخرین ویرایش در این ارسال: ۱۶-مرداد-۱۳۹۱ ۱۵:۵۲:۰۲، توسط ana_ana.)
۱۶-مرداد-۱۳۹۱ ۱۵:۴۹:۴۷
یافتن تمامی ارسال های این کاربر
نقل قول این ارسال در یک پاسخ
ارسال پاسخ 


موضوع های مرتبط با این موضوع...
موضوع: نویسنده پاسخ: بازدید: آخرین ارسال
  سوالات مربوط به openCV ROBOTICS 9 1,757 ۲۲-مرداد-۱۳۹۱ ۱۲:۰۳:۱۶
آخرین ارسال: h0x00i

پرش به انجمن: