تشخیص نتایج فوتبال از روی score box - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تشخیص نتایج فوتبال از روی score box

+1 امتیاز

سلام دوستان.

قصد دارم یه برنامه ای بنویسم که هر در ابتدا بتونه score box را مکان یابی کنه و سپس هر لحظه پروسسش کنه .راه حل شما برای اینکار چیه؟

c++, opencv, پردازش تصویر

سوال شده فروردین 9, 1393  بوسیله ی RED (امتیاز 494)   9 30 41
ویرایش شده بهمن 1, 1393 بوسیله ی haniye sarbazi

2 پاسخ

+3 امتیاز
 
بهترین پاسخ

در هر فریم مقادیر نظیر به نظیر پیکسل ها را از فریم قبلی کم و قدر مطلق بگیرید و سپس این مقادیر را در تصویر اعشاری انباشتگر ،انباشت کنید .پس از نمایش n فریم قسمتی از تصویر ثابت خواهد ماند .یعنی میزان تغییرات را آن صفر می باشد.حال در این کادر بلابی در هر ثانیه تغییر شکل داده و در 10 ثانیه بعدی به شکل فعلی بر می گرده که ثانیه شماره در راستای افقی همین بلاب در سمت چپش یلالبی قرار داره که هر 10 ثانیه تغییر می کنه و هر 60 ثانیه به مقدار قبلیش بر می گرده به همین ترتیب موقعیت دقیقه شمار را هم مشخص کنید البته در فریم های اولیه با توجه به ابعاد و رنگ نوشته و پشت زمینه.

پس از آن بایستی به نوشته های موجود در کادر را تشخیص بدید که قاعدتاً بخشی مربوط به نام تیم ها و بخش میانی مربوط به امتیازات دو تیم هستش .یکی از روش های بسیار رایج برای پیدا کردن نوشته ها استفاده از distance transform هستش به طوریکه مقدار ماکزیمم را در هر بلاب از روی تصویر distance transform محاسسبه می کنند و سپس مقادیر را به هیستوگرام انتقال میدن و مقداری که دارای بیشترین فراوانی باشه به عنوان اندازه stroke در نظر می گیرند و بقیه بلاب ها را حذف می کنند. حالا مجموعه بلاب ها بدست آمده و می تونیم کادر مربوط به نوشته ها را محاسبه کنیم 2 بلابی که در قسمتی میانی این کادر قرار دارند و ارتفاعی نسبتا برابر دارند مقادیر score یا امتیازات مربوط به دو تیم هستند.
در نهایت بلاب ها مربوط به امتیازات را با یک کلاسیفیر می تونید شناسایی کنید که برای این حالت که 10 تا رقمه می تونید از هر کلاسیفیری استفاده کنید.
پاسخ داده شده فروردین 9, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ویرایش شده فروردین 9, 1393 بوسیله ی مصطفی ساتکی
+2 امتیاز

در مورد مکان یابی کافیه که  روی چند تا فریم - یا & انجام بدی محل تقریبی score box بدست میاد

مثلا

void findArea(VideoCapture& vid,Mat& result)
{
    const int lastPos=vid.get(CV_CAP_PROP_POS_FRAMES);
    const int NUMBER_OF_FRAMES=7;
    const int totalFrames=vid.get(CV_CAP_PROP_FRAME_COUNT)-800;
    srand(time(NULL));

    std::vector<Mat>frames;
    Mat frame;

    for(int i=0;i<NUMBER_OF_FRAMES;i++)
    {
        int pos=rand()%totalFrames+400;
        vid.set( CV_CAP_PROP_POS_FRAMES, pos);
        vid>>frame;
        Rect upper(0,0,frame.rows,frame.cols/6);
        frames.push_back(frame(upper).clone());
    }

    result=frames[0];
    for(int i=1;i<NUMBER_OF_FRAMES-1;i++)
    {
        result &=frames[i];
    }

    imshow("score board",result);
    vid.set( CV_CAP_PROP_POS_FRAMES, lastPos);
}

البته اگر قالب این score board  همیشه ثابت باشه مثلا اون عکس چپش  می تونی راخت با جست و جو تو عکس پیداش کنی

 

پاسخ داده شده فروردین 9, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...