《学习OpenCV》第四章课后题6

题目说明:
写一个程序,使其创建一幅图像,然后将图像所有像素值置为0,显示出来。当用户点击一个位置,便可以在此位置输入一个标签。允许使用Enter键进行编辑,以及实现一个退出键。按Enter键可以修改当前位置的标签。

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

#define IMG_WIDTH  512
#define IMG_HEIGHT 512


CvFont font;   
char *display_text = "|";

// 是否在编辑标签
bool isEditLabel = false;
// 当前标签的起始点
CvPoint point; 

IplImage* image;

int EnterKey;//新添加变量,用于判断是否可以编辑文本

/* 
 * 鼠标事件回调函数 
 */  
void my_mouse_callback(int event, int x, int y, int flags, void* param)  
{  
    // 得到图像  
    //IplImage* image = (IplImage*) param;  

    switch(event)  
    {  
        // 鼠标左键点击事件  
    case CV_EVENT_LBUTTONDOWN: 
        isEditLabel = true;
        point = cvPoint(x, y);
        cvPutText( param, display_text, point, &font, cvScalarAll(255)); 
        break;  
        // 鼠标右击事件
    case CV_EVENT_RBUTTONDOWN:
         //文本输入结束,不可更改
        isEditLabel = false;
        cvPutText( image, display_text, point, &font, cvScalarAll(255)); 
        display_text = "|";
        EnterKey = 0;
        break;

    }  
}  

int main()  
{  
    // 创建一幅图像
    image = cvCreateImage( cvSize(IMG_WIDTH, IMG_HEIGHT), IPL_DEPTH_8U, 3 );
    // 所有像素置零
    cvZero( image );

    IplImage* temp = cvCloneImage( image );

    cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.5f, 1.5f, 0, 1, 8);  

    cvNamedWindow("image");  
    cvSetMouseCallback( "image", my_mouse_callback, (void*)temp );  

    while(1)  
    {   
        cvCopyImage( image, temp);
        if(isEditLabel == true)
        {
            puts(display_text);
            cvPutText( temp, display_text, point, &font, cvScalarAll(255));  
        }
        cvShowImage("image", temp);  

        char c = cvWaitKey(15);

        // 32 -- 126 可显示字符
        if(isEditLabel == true && c < 126 && c > 32)
        {
            char tempstr[2] = {c};
            if(display_text == "|")
            {
                display_text = (char*)malloc(sizeof(char)*2);
                strcpy( display_text, tempstr );
            }
            else
            {
                strcat( display_text, tempstr );
            }
        }
        // 13 -- Enter键
        else if(c == 13 )
        {
            EnterKey = 1;
        }
        // 8 -- 退格键
        else if(c == 8 && EnterKey ==1 )
        {
            int len = strlen(display_text);
            printf("<--\t%d\n", len);
            display_text[len - 1] = '\0';

        }
        else if(c == 27) break;  
    }  

    cvReleaseImage( &image );
    cvReleaseImage( &temp );
    cvDestroyAllWindows();  
    return 0;  
}  

代码更改处:引入EnterKey,使得在按下enter键时才可以对文本进行编辑。

引用:qdsclove的专栏
http://blog.csdn.net/stk_overflow/article/details/8760483

发布了19 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/windxf/article/details/47865007