2008年6月19日 星期四

GUI介面的製作-"cvcam.h"視訊函式庫(2)

接著是另外一個實作,把它嵌入在OpenCV的GUI上,這邊利用到cvGetWindowHandle()來做嵌入,當然,必須要用到cvNamedWindow()啦,再從cvGetWindowHandle()取得它的Handle,以下程式碼

cvcam.h使用OpenCV視窗介面播放視訊
#include <cvcam.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>


void CaptureCallback(IplImage *image);
void onMouse(int Event,int x,int y,int flags,void *param);
void onTrackbar(int position);

int TrackbarInitValue=20;
int TrackbarPosition=20;

int main()
{
    cvcamGetCamerasCount();

    HWND CaptureWindow;
    cvNamedWindow("Webcam",0);
    CaptureWindow =(HWND)cvGetWindowHandle("Webcam");

    cvcamSetProperty(0,CVCAM_PROP_ENABLE,CVCAMTRUE);
    cvcamSetProperty(0,CVCAM_PROP_RENDER,CVCAMTRUE);
    cvcamSetProperty(0,CVCAM_PROP_WINDOW,&CaptureWindow);

    cvSetMouseCallback("Webcam",onMouse,NULL);
    cvCreateTrackbar("Change","Webcam",&TrackbarInitValue,255,onTrackbar);
    cvcamSetProperty(0,CVCAM_PROP_CALLBACK,(void *)&CaptureCallback);

    cvcamInit();
    cvcamStart();

    cvWaitKey(0);
    cvcamStop();
    cvcamExit();

}

void CaptureCallback(IplImage *frame)
{
    int i,j;
    for(i=0;i<frame->height;i+=TrackbarPosition)
    {
        for(j=0;j<frame->widthStep;j+=frame->nChannels)
        {
            frame->imageData[i*j] =0;
            frame->imageData[i*j+1]=0;
            frame->imageData[i*j+2]=255;
        }
    }
}
void onMouse(int Event,int x,int y,int flags,void* param )
{
    printf("0");
    if(Event==CV_EVENT_LBUTTONDOWN)
    {
        cvcamPause();
        printf("1");
    }
    else if(Event==CV_EVENT_RBUTTONDOWN)
    {
        cvcamResume();
        printf("2");
    }
}
void onTrackbar(int position)
{
    TrackbarPosition=position;
}

執行結果:


很遺憾,OpenCV視窗程式沒有提供Button的功能,要不然cvcamStart(),cvcamPause(),cvcamResume(),cvcamStop()等可以做到如Real Player播放器一樣,上面的程式碼,除了把之前不必要的屬性刪除加入了滑鼠事件及Trackbar(),滑鼠事件的設計,當按左鍵就暫停,按右鍵就繼續,Trackbar()則修改了for迴圈的規則.

cvcamPause()
暫停視訊

cvcamResume()
從暫停中重新啟動

--
附註:Opencv1.0 only,如果opencv 1.1想要使用的話,可以到sourceforge的opencv網站上下載

0 意見:

Copyright 2008-2009,yester