题目说明:
写一个程序,使其创建一幅图像,然后将图像所有像素值置为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