原创 GUI界面的制作-"cvcam.h"视讯函式库(2)

2009-2-21 22:47 2954 7 7 分类: 软件与OS

 


接着是另外一个实作,把它嵌入在OpenCVGUI,这边利用到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;
}

执行结果:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />3afd5e8a-c9b6-4599-a7fd-ef2e98783138.JPG

很遗憾,OpenCV窗口程序没有提供Button的功能,要不然cvcamStart(),cvcamPause(),cvcamResume(),cvcamStop()等可以做到如Real Player播放器一样,上面的程序代码,除了把之前不必要的属性删除加入了鼠标事件及Trackbar(),鼠标事件的设计,当按左键就暂停,按右键就继续,Trackbar()则修改了for循环的规则.

cvcamPause()
暂停视讯

cvcamResume()
从暂停中重新启动


 

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条