2008年6月15日 星期日

GUI介面的製作-鍵盤事件

鍵盤事件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大寫加底線的那些參數集,利用這種方式做參數的切換.



0 意見:

Copyright 2008-2009,yester