GUI接口的制作-键盘事件

风在竹林 posted @ 2009年7月12日 23:10 in OpenCV with tags OpenCV窗口接口程序设计 , 2936 阅读

键盘事件cvWaitKey(),最相似的例子就是"stdio.h"的scanf()输入,cvWaitKey()跟scanf()做比较的话,一个是 在OpenCV的窗口接口(GUI)上等待键盘输入,另一个是在命令及提示字符(CommandLine)上等待键盘输入,下面就是同时使用 cvWaitKey()跟scanf()的例子:

阻断式键盘事件测试

#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>

int main()
{
    IplImage *Image1 = cvLoadImage("Splash.jpg",1);

    cvNamedWindow("KeyboardTest",0);
    cvMoveWindow("KeyboardTest",300,300);
    cvResizeWindow("KeyboardTest",320,240);

    char GUIInput;
    char CommandlineInput[2];
    printf("==按Q跳出循环==\n\n");
    while(true)
    {
        cvShowImage("KeyboardTest",Image1);

        printf("窗口接口输入\n");
        GUIInput = cvWaitKey(0);
        printf("%c\n输出结果 : %c\n",GUIInput,GUIInput);

        if(GUIInput=='Q')     break;

        printf("命令提示字符输入\n");
        scanf("%s",&CommandlineInput);
        printf("输出结果 : %s\n",CommandlineInput);


        if(strchr(CommandlineInput,'Q'))     break;

    }
    cvDestroyWindow("KeyboardTest");
    cvReleaseImage(&Image1);
}


图片:

 

执行结果:
(1) (2)
 
上面的程序代码,cvWaitKey(),scanf()都属于阻断式(block)键盘输入,它会让while循环中断执行,等待键盘事件的发生,再往下一进程式码移动,接下来的例子就是非阻断式(unblock)的了.

非阻断式键盘事件测试

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main()
{
    IplImage *Image1 = cvLoadImage("Splash.jpg",1);

    cvNamedWindow("KeyboardTest",0);
    cvResizeWindow("KeyboardTest",320,240);

    char GUIInput;
    printf("==按Q跳出循环==\n\n");
    while(true)
    {
        cvShowImage("KeyboardTest",Image1);

        printf("非阻断式键盘输入\n");
        GUIInput =cvWaitKey(1000);
        printf("输出结果 : %d(%c)",GUIInput,GUIInput);

        if(GUIInput=='Q')     break;
    }
    cvDestroyWindow("KeyboardTest");
    cvReleaseImage(&Image1);
}

执行结果:

很明显,从执行结果可以看出,cvWaitKey()不停的侦测键盘事件,每1000毫秒做一次侦测,实际上,while循环一直在执行,没有被中断,当超过1000毫秒的时候自动输出结果为-1,但是,键盘事件为ASCII code,-1并不会显示任何字,所以要用整数类型来代替,在这边,这种功能对视频来说是很重要的一环,当在检视OpenCV内建的Sample Code时(程序集->OpenCV->Samples)很多功能都用这种方法来做Hot Key(热键),它的Hot key大多代表的就是0penCV大写加底线的那些参数集,利用这种方式做参数的切换.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter