C multiThread (Aynı Anda 3 den fazla programı çalıştırma)

Başlatan Kaanx, 20 Nisan 2014 - 14:58:29

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Kaanx

Merhabalar C ile multithread kosturmak istiyorum. VLC + Webcam + Alsa ve FreeTUXtv gibi bunları bi C kodunda yazıp ./çalıştırProgramlar dediğimde hepsi ayrı thread olarak çalışabilir mi acaba ?

http://softpixel.com/~cwright/programming/threads/threads.c.php


#include <pthread.h>
#include <stdio.h>

/* This is our thread function.  It is like main(), but for a thread*/
void *threadFunc(void *arg)
{
char *str;
int i = 0;

str=(char*)arg;

while(i < 110 )
{
usleep(1);
printf("threadFunc says: %s\n",str);
++i;
}

return NULL;
}

int main(void)
{
pthread_t pth; // this is our thread identifier
int i = 0;

pthread_create(&pth,NULL,threadFunc,"foo");

while(i < 100)
{
usleep(1);
printf("main is running...\n");
++i;
}

printf("main waiting for thread to terminate...\n");
pthread_join(pth,NULL);

return 0;
}



Burada
thread1 system("vlc -vvv https.....")
thread2 system("freetuxTV")
thread3("Opencv ile yazdıgım kontrol programı ./Smarttv");

olucak şekilde kosturmak istiyorum ve bu uygulamalar hepsi birbiriyle haberleşir halde olmalı mesela Opencv cameradan verdiğim komutları vlc player algılamalı kanal değişimi yapmalı gibi
Konuyla alakalı bir diğer başlık https://forum.ubuntu-tr.net/index.php?topic=42990.0 incelemek isterseniz olay hakkında biraz bilgi sahibi olabiliriz :)

Kaanx



Kaanx

Teşekkürler hocam başlıkları inceleyip takıldıgım yerler içinde sizlerden yardım bekliyor olucam :)

if


Kaanx


if


sem

Selamlar...

Eğer uygulamaları system() komutu ile çalıştıracaksanız zaten thread'e ihtiyacınız yok demektir. Çünkü thread'ler bir prosesin parçalarıdır ve aralarında global değişkenleri ortak kullanırlar ve merkezi bir proses içerisinde yönetilirler. Fakat bir uygulamayı system() komutu ile başlatacaksanız sizin değişkenlerinizi de görmez, uygulama yaşam döngüsü (life cycle) de sizin elinizde olmaz. Uygulamayı sadece başlatıp sonlandırabilirsiniz.

Bu şekildeki bir yapı çok doğru değil açıkçası yazılım mimarisi olarak. Fakat bu şekilde gitmek benim için sorun değil diyorsanız eğer; komut satırından verdiğiniz  komut sonuna & koyarsanız uygulamalar arka planda, ana uygulamayı bloke etmeden çalışacaktır.


system(vlc &);

gibi örneğin.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Kaanx

Alıntı yapılan: sem - 10 Mayıs 2014 - 02:09:17
Selamlar...

Eğer uygulamaları system() komutu ile çalıştıracaksanız zaten thread'e ihtiyacınız yok demektir. Çünkü thread'ler bir prosesin parçalarıdır ve aralarında global değişkenleri ortak kullanırlar ve merkezi bir proses içerisinde yönetilirler. Fakat bir uygulamayı system() komutu ile başlatacaksanız sizin değişkenlerinizi de görmez, uygulama yaşam döngüsü (life cycle) de sizin elinizde olmaz. Uygulamayı sadece başlatıp sonlandırabilirsiniz.

Bu şekildeki bir yapı çok doğru değil açıkçası yazılım mimarisi olarak. Fakat bu şekilde gitmek benim için sorun değil diyorsanız eğer; komut satırından verdiğiniz  komut sonuna & koyarsanız uygulamalar arka planda, ana uygulamayı bloke etmeden çalışacaktır.


system(vlc &);

gibi örneğin.


Hocam cok tesekkur ederim sanırım asıl konum buydu benimde :) sizle paylastıgım örnekte ben system(vlc) yi thread içinde acıyordum yani ayrıyetten sistemi yoruyordum sanırım dimi ?

Kaanx

Hocam merhaba tekrardan söyle bir sorunla karsı karsıyayım. Ben renk tanıma yapıyorum ama elimi o renk üzerinde tuttugumda bir sürü thread kuruyor. yani elimi 1 s tuttuysam 10 tane vlc player başltıyor. istiyorum ki ben elimi getirince 1 kez yapsın bu işlemi nasıl çözebilirim ?

sem

Selamlar,

Fazla thread için sistemi yorma demeyelim. Belki daha az yoracak dizayn da olabilir. Burada sorun tamamen ihtiyaca ve tasarıma dayanıyor. Thread kullanmak için bir gereksinimiz yok diye anlıyorum ben, çünkü uygulamaları çalıştırıyorusunuz daha sonra bu uygulamalar sizin hiç bir değişkeninizi kullanmıyor, yaşam döngülerini doğrudan siz yönetmiyorsunuz vs. diye dedim aslında.

Renk tanıma fonksiyonu, elinizin tespit ettiği her bir durumda vlc başlatıyorsa bu durumda böyle bir sorunla karşılaşabilirsiniz. Hangi işlemlerin üst üste yapılmayacağına karar verin derim önce. Örneğin VLC bir kere açıldıysa bir kere daha açılmasın diyorsak, yani ihtiyaç buysa eğer buna dair bir flag tutabilirsiniz. Bu flag değişkeni 0 ya da 1 değerini alıyor diyelim, 0 ise çalışmamış 1 ise çalışmış;

if(vlc_start_flag == 0)
     -> vlc başlatma işlemleri
else
     -> vlc zaten çalışıyor, bir işlem yapma.

Daha sonra kullanıcı VLC yi kapattığında flag değerini de 0 a çekmeyi unutmayın tabi =)... Bir de thread'ler arasında bu değişkeni kullanacaksanız ya kontrol fonksiyonunu mutex nesneleri ile asenkron (birden fazla thread ile çalışabilir)  yerine  senkronize hale getirebilirsiniz. Ya da değişkeninizi volatile olarak tanımlayabilirsiniz. Her ikisini de uygulamak uygulamanın güvenilirliliği açısından daha iyi olacaktır.

Bu şekilde bir bayrak çekme yöntemi birden fazla VLC açılmasını engelleyebilir.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Kaanx

Aynen flag işlmeini bende ekldim fakat flag = 0 , flag =1 nerede olucak bilemedim hocam o yüzden işin cıkamadım. bnm yaptıgım işlemde vlc calısınca flag=1 oluyor (yani elim play butonunda) vlc acılınca diyorum ki flag =0 artık vlc bi kere daha acma. ama elim o bölgede oldugu surece yani 2 saniye dersem o 2 saniye boyunca acabildiği kadar vlc acıyor. işlemi 1 kez yaptırıp durduramıyorum bekleme süresi koydum araya ama yine çözmedi. Sleep ekldim bu kez hersey uyudu :) işin Bu proje gercekten yılan hikayesine döndü hocam :D

sem

=) aynen biraz yılan hikayesine döndü...

Öncelikli sorularım, flag değeriniz volatile mi ve mutex vs nesnelerini kullandınız mı?

Sonra şöyle gidelim; OpenCV sizden bir handler istemeli, olayı yakalamanız için çalıştırılacak bir kod bloğu, bir fonksiyon vs.... Bu kod bloğunda siz vlc yi açıyorsunuz şu anda. VLC yi açma işlemine if else koşulu koyduğunuzda sorun yaşamamalısınız. vlc'yi çalıştırdığınız fonksiyonun kodunu paylaşabilir misiniz bu başlık altından.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Kaanx

Hocam söyle paylasıyorum kodu : ) ;


/*
* SmartTV.cpp
*
*  Created on: 29 Mar 2014
*      Author: kaan
*/


/*OpenCV C headers `pkg-config --cflags opencv` `pkg-config --libs opencv`  for on GNU */
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <cmath>
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
/*MultiTask C headers -pthread For on GNU */
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
/*VLC Headers  gcc test.o -o test $(pkg-config --libs libvlc) */
#include <vlc/vlc.h>
/*GTK PLAYER HEADERS gcc -o gtk_player gtk_player.c `pkg-config --libs gtk+-2.0 libvlc` `pkg-config --cflags gtk+-2.0 libvlc`*/
#include "gtkplayer.h"


using namespace std;
using namespace cv;


#define blue  CV_RGB(0,0,255)
#define green CV_RGB(0,255,0)
#define red   CV_RGB(255,0,0)
#define white CV_RGB(255,255,255)
#define black CV_RGB(0,0,0)



pthread_t tid[2];



void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
     if  ( event == EVENT_LBUTTONDOWN )
     {
          cout << "Sol Tıklama - poziyon (" << x << ", " << y << ")" << endl;

     }
     else if  ( event == EVENT_RBUTTONDOWN )
     {
          cout << "Sağ tıklama - pozisyon (" << x << ", " << y << ")" << endl;

     }
     else if  ( event == EVENT_MBUTTONDOWN )
     {
          cout << "Orta buton tıklama - pozisyon (" << x << ", " << y << ")" << endl;
     }
     else if ( event == EVENT_MOUSEMOVE )
     {
          cout << "Window taşıma  - pozisyon (" << x << ", " << y << ")" << endl;

     }
}

void* doSomeThing(void *arg)
{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    if(pthread_equal(id,tid[0]))
    {
        printf("\n First thread processing\n");
        //system("vlc --rc-unix= play /home/kaan/Masaüstü/OpenCV/OpenCvC++/Eclipse/OpenCVProject/src/TV.m3u8"); //Start VLC Player Stream
        //system("vlc --audio && --playlist-autostart && --volume 400");
        //system("freetuxtv");

        system("vlc -vvv Telecine.m3u ");
        /**************************GTK PLAYER REGION**************************/
/*
        GtkWidget *window,
                    *vbox,
                    *menubar,
                    *filemenu,
                    *fileitem,
                    *filemenu_openitem,
                    *player_widget,
                    *hbuttonbox,
                    *stop_button;

          //gtk_init (&argc, &argv);
          // setup window
          window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
          gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
          g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
          gtk_container_set_border_width (GTK_CONTAINER (window), 0);
          gtk_window_set_title(GTK_WINDOW(window), "SmartTV Stream Window");
          //setup vbox
          vbox = gtk_vbox_new(FALSE, 0);
          gtk_container_add(GTK_CONTAINER(window), vbox);
          //setup menu
          menubar = gtk_menu_bar_new();
          filemenu = gtk_menu_new();
          fileitem = gtk_menu_item_new_with_label ("File");
          filemenu_openitem = gtk_menu_item_new_with_label("Open");
          gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), filemenu_openitem);
          gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu);
          gtk_menu_bar_append(GTK_MENU_BAR(menubar), fileitem);
          gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
          g_signal_connect(filemenu_openitem, "activate", G_CALLBACK(on_open), window);
          //setup player widget
          player_widget = gtk_drawing_area_new();
          gtk_box_pack_start(GTK_BOX(vbox), player_widget, TRUE, TRUE, 0);
          //setup controls
          //playpause_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PLAY);
          playpause_button = gtk_button_new_with_label("gtk-media-play");
          gtk_button_set_use_stock(GTK_BUTTON(playpause_button), TRUE);
          stop_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
          g_signal_connect(playpause_button, "clicked", G_CALLBACK(on_playpause), NULL);
          g_signal_connect(stop_button, "clicked", G_CALLBACK(on_stop), NULL);
          hbuttonbox = gtk_hbutton_box_new();
          gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox), BORDER_WIDTH);
          gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_START);
          gtk_box_pack_start(GTK_BOX(hbuttonbox), playpause_button, FALSE, FALSE, 0);
          gtk_box_pack_start(GTK_BOX(hbuttonbox), stop_button, FALSE, FALSE, 0);
          gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);
          //setup vlc
          vlc_inst = libvlc_new(0, NULL);
          media_player = libvlc_media_player_new(vlc_inst);
          g_signal_connect(G_OBJECT(player_widget), "realize", G_CALLBACK(player_widget_on_realize), NULL);
          gtk_widget_show_all(window);
          gtk_main ();
          libvlc_media_player_release(media_player);
          libvlc_release(vlc_inst);
          return 0;*/
    }
    /*else
    {
        printf("\n Second thread processing\n");
        //system("freetuxtv");

//system("/home/kaan/Masaüstü/OpenCV/OpenCvC++/Eclipse/OpenCVProject/src/.SmartTV");
    }
*/
    for(i=0; i<(0xFFFFFFFF);i++);


    return NULL;
}

void ClearScreen(IplImage* imgScribble, IplImage* imgDrawing)
{
    cvSet(imgScribble, black);
    cvSet(imgDrawing, white);
}

IplImage* GetThresholdedImage(IplImage* img, CvScalar& lowerBound, CvScalar& upperBound)
{
    // Convert the image into an HSV image
    IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3);
    cvCvtColor(img, imgHSV, CV_BGR2HSV);

    IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1);

    cvInRangeS(imgHSV, lowerBound, upperBound, imgThreshed);

    cvReleaseImage(&imgHSV);
    return imgThreshed;
}

int main( int argc, char *argv[] )
{

//Multithread prototype
int i = 0;
int err;
    // controls
    double area_limit = 700;
    CvScalar lowerBound = cvScalar(20, 100, 100);  // yellow
    CvScalar upperBound = cvScalar(30, 255, 255);

    // defaults
    int lineThickness=0;
    CvScalar lineColor = white;


    CvCapture* capture = 0;
    capture = cvCaptureFromCAM(001);
    if(!capture)
    {
        cout << "Could not initialize capturing...\n";
        return -1;
    }

    // This image holds the "scribble" data...
    // the tracked positions of the pointer object
    IplImage* imgScribble = NULL;


    IplImage* imgColorPanel = 0;
    imgColorPanel = cvLoadImage( "Panel6.png",  CV_LOAD_IMAGE_COLOR ); // load the panel image. (This is a png image, not designed/included in the source code!)
    if(!imgColorPanel)
    {
        cout << "cvPaint.panel is not found !!! \n";
        return -1;
    }



    IplImage* imgDrawing = 0;
    imgDrawing = cvCreateImage( cvSize(cvQueryFrame(capture)->width,cvQueryFrame(capture)->height),
                                cvQueryFrame(capture)->depth,     //Bit depth per channel
                                3  //number of channels
                              );
    cvSet(imgDrawing, white);

    CvFont font, fontbig;
    cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 1, .6, 0, 2, CV_AA);
    cvInitFont( &fontbig, CV_FONT_HERSHEY_COMPLEX, 3, .6, 0, 3, CV_AA);

    int confirm_close = 10, confirm_clear = 20; // counters for clear and exit confirmation
    char buffer [50]; // buffer for cvPutText
    int image_num = 0; // to keep track of image numbers for saving
    int posX = 0;
    int posY = 0;

    while(true)
    {


        IplImage* frame = 0;
        frame = cvQueryFrame(capture);
        if(!frame)
            break;
        cvFlip(frame,NULL,1); // flip the frame to overcome mirroring problem



        // If this is the first frame, we need to initialize it
        if(imgScribble == NULL)
            imgScribble = cvCreateImage(cvGetSize(frame), 8, 3);

        // Median filter to decrease the background noise
        cvSmooth( frame, frame,
                  CV_MEDIAN,
                  5, 5 //parameters for filter, in this case it is filter size
                );


        // Holds the thresholded image (tracked color -> white, the rest -> black)
        IplImage* imgThresh = GetThresholdedImage(frame,lowerBound,upperBound);

        // Calculate the moments to estimate the position of the object
        CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
        cvMoments(imgThresh, moments, 1);


        // The actual moment values
        double moment10 = cvGetSpatialMoment(moments, 1, 0);
        double moment01 = cvGetSpatialMoment(moments, 0, 1);
        double area = cvGetCentralMoment(moments, 0, 0);

        // Holding the last and current positions
        int lastX = posX;
        int lastY = posY;

        posX = 0;
        posY = 0;


        if(moment10/area>=0 && moment10/area < 1280 && moment01/area >=0 && moment01/area < 1280
           && area>area_limit /* to control the limit */ )
        {
            posX = moment10/area;
            posY = moment01/area;
        }



        CvPoint cvpoint = cvPoint(150,30); // location of the text
        if(posX < 90 && posY > 400) // clear
        {
           // lineColor = white; // white color works as eraser
            //cvPutText( frame, "Eraser selected.", cvpoint, &font, white );
            //sprintf (buffer, "Clearing the screen in %d",confirm_clear); // count-down for clearing the screen
           // cvPutText( frame, buffer, cvPoint(150,70), &font, red );
            //confirm_clear--;
            //if(confirm_clear < 0) // confirm in 10 frames before clearing
            //{
              //  confirm_clear = 20;
               // sprintf (buffer, "d0%d.jpg",image_num++);
               // cvSaveImage(buffer ,imgDrawing); // save the frame into an image
               // ClearScreen(imgScribble,imgDrawing);
               //cvPutText( frame, "Cleared the screen.", cvPoint(150,110), &font, white );
           // }
        }
        else if(posX > 540 && posY > 0 && posY < 115)  // PLAY
        {

           // lineColor = blue;
            cvPutText( frame, "PLAY TV", cvpoint, &font, blue );
           /* MultiThread Generating */
              err = pthread_create(&(tid[i]),NULL , &doSomeThing, NULL);
                if (err != 0)
                printf("\ncan't create thread :[%s]", strerror(err));
                 else
                printf("\n Thread created successfully\n");
                  i++;

                  for(int j=0;j<500000000;j++)
                  {}
                  for(int j=0;j<100000000;j++)
                  {}
                /*Control Panel Activate*/
                system("xdotool windowactivate 60817420");
                system("xdotool windowactivate --window 0x3a0000c");
                  //on_playpause(playpause_button,media_player);
                  //sleep(1.3);
               /*GTK Player Play Command*/

                  /*system("xdotool windowactivate 65011724");
                  system("xdotool windowactivate 65011724");
                  system("xdotool mousemove --window 0x3e0000c 320 160");
                  system("xdotool click 1");*/

                  //system("xdotool key f");
        }

        else if(posX  > 540 && posY > 140 && posY < 230) // PAUSE
        {
            //lineColor = green;
            cvPutText( frame, "PAUSE TV.", cvpoint, &font, green );
            for(int j=0;j<500000000;j++)
                              {}

            /*VLC TV Panel Activate*/
            system("xdotool windowactivate 65011714");
            system("xdotool windowactivate --window 0x3e00002");
                        for(int j=0;j<100000000;j++)
                        {}
            system("xdotool key space"); //play & stop button
            /*Control Panel Activate*/
            for(int j=0;j<100000000;j++)
            {}
            system("xdotool windowactivate 60817420");
            system("xdotool windowactivate --window 0x3a0000c");
            //on_stop(playpause_button,media_player);
           /* system("xdotool windowactivate 65011724");
            system("xdotool windowactivate 65011724");
            system("xdotool mousemove --window 0x3e0000c 320 160");
            system("xdotool click 3");*/
           //system("xdotool mousemove  1366 0");
           //system("xdotool click 1");
            /*for(i=0;i<10000;i++)
            {}*/

        }

        else if(posX  > 540 && posY > 265 && posY < 365) //Forward Channel
        {
            //lineColor = red;
            cvPutText( frame, "FORWARD CHANNEL", cvpoint, &font, red );
            for(int j=0;j<100000000;j++)
                                        {}
            /*VLC TV Panel Activate*/
            system("xdotool windowactivate 65011714");
            system("xdotool windowactivate --window 0x3e00002");
            for(int j=0;j<500000000;j++)
                                           {}
                       system("xdotool key n"); //next channle button

                       /*Control Panel Activate*/
                       for(int j=0;j<100000000;j++)
                       {}
                       system("xdotool windowactivate 60817420");
                       system("xdotool windowactivate --window 0x3a0000c");

        }

        else if(posX  > 540 && posY > 280 && posY < 480) //Backward Channel
        {
            //lineColor = red;
            cvPutText( frame, "BACKWARD CHANNEL.", cvpoint, &font, red );
            for(int j=0;j<100000000;j++)
                                        {}

            /*VLC TV Panel Activate*/
            system("xdotool windowactivate 65011714");
            system("xdotool windowactivate --window 0x3e00002");
                        for(int j=0;j<500000000;j++)
                                          {}
                       system("xdotool key p"); //previous channle button


            for(int j=0;j<100000000;j++)
            {}
             /*Control Panel Activate*/
            system("xdotool windowactivate 60817420");
            system("xdotool windowactivate --window 0x3a0000c");
        }

        else if(posX > 0 && posX  < 90 && posY > 0 && posY < 120) // exit
        {
        //pthread_cancel(tid[0] && tid[1] && tid[2]);
           for(int j=0;j<500000000;j++)
           {}

           system("xdotool windowactivate 65011714");
           system("xdotool windowactivate --window 0x3e00002");
                       for(int j=0;j<100000000;j++)
                       {}
        system("xdotool key --delay 0 --clearmodifiers ctrl+q");

            //sprintf (buffer, "EXITING in %d",confirm_close);
            //cvPutText( frame, buffer, cvpoint, &font, red );
            //confirm_close--;
            //if(confirm_close < 0) // confirm in 10 frames before exit

                break;
        }
        else if(posX < 120 && posY > 130 && posY < 205) // Volume Control
        {
            //lineThickness = 6 - ( posY/60-1 );  // change the thickness of line from 1 - 5 based on posY

            system("amixer -D pulse sset Master 5%+");
            cvPutText( frame, "Ses Seviyesi %d", cvpoint, &font, blue );


        }
        else if(posX < 120 && posY > 245 && posY < 350){

        system("amixer -D pulse sset Master 5%-");
        cvPutText( frame, "Ses Seviyesi %d", cvpoint, &font, blue );
        }
        else if(posX < 120 && posY > 400 && posY < 480){

                system("amixer -D pulse sset Master 0%");
                cvPutText( frame, "MUTE", cvpoint, &font, blue );
               }




        sprintf (buffer, "%d",lineThickness);
        cvPutText( frame, buffer, cvPoint(40,255), &fontbig, lineColor );

double diff_X = lastX-posX;
double diff_Y = lastY-posY;
        double magnitude = sqrt(   pow(diff_X,2) + pow(diff_Y,2)   );
        // We want to draw a line only if its a valid position
        //if(lastX>0 && lastY>0 && posX>0 && posY>0)
        if(magnitude > 0 && magnitude < 100 && posX > 120 && posX<530)
        {
            // Draw a line from the previous point to the current point
            cvLine(imgDrawing, cvPoint(posX, posY), cvPoint(lastX, lastY), lineColor, lineThickness,CV_AA);
        }

        // Add the scribbling image and the frame...
        cvAdd(imgDrawing, imgScribble, imgDrawing);

        // Combine everything in frame
        cvAnd(frame, imgDrawing, frame);
        cvAnd(imgColorPanel, frame, frame);


        cvShowImage("Threshold", imgThresh);
        /*cvShowImage("Drawing", imgDrawing);*/
        cvShowImage("Video", frame);


        //set the callback function for any mouse event
       setMouseCallback("Video", CallBackFunc, NULL);

        int c = cvWaitKey(10);
        if(c==27)  //ESC key
            break;
        //else if(c==49) // 1 key


        cvReleaseImage(&imgThresh);
        delete moments;
    }

    cvReleaseCapture(&capture);
    cvReleaseImage(&imgColorPanel);
    cvReleaseImage(&imgScribble);



    return 0;
}








biraz uzun ama anlasılır durumda opencv ve VLC baglantısı olan hersey içinde