写一个程序,使其创建一幅图像,然后将图像所有像素值置为0,显示出来。当用户点击一个位置,便可以在此位置输入一个标签。允许使用Enter键进行编辑,以及实现一个退出键。按Enter键可以修改当前位置的标签。
#include<iostream>
#include"highgui.h"
#include"cv.h"
using namespace std;
using namespace cv;
#define WIDTH 512
#define HEIGHT 512
IplImage *img = cvCreateImage(cvSize(WIDTH, HEIGHT), 8, 3);
IplImage *t = cvCloneImage(img);
int ok = 0;
int enter = 0;
int flagright=0;
CvPoint point;
char *c = "|";
void on_mouse(int event, int x, int y, int flags, void *param) {
switch (event) {
//按下左键后
case CV_EVENT_LBUTTONDOWN: if (flagright) c = "|";//判断是否按过右键
if(c[0]=='|')//判断按下左键,是移动,还是准备建立标签
enter = 1;
else
enter = 0;
flagright = 0;
ok = 1;
point = cvPoint(x, y);
cvPutText(img, c, point, &cvFont(1), cvScalarAll(255));
break;
//按下右键后
case CV_EVENT_RBUTTONDOWN: cvCopy(img, t); enter = 0;
ok = 0; flagright = 1; break;
}
}
int main() {
cvZero(img);
cvZero(t);
cvNamedWindow("test");
cvSetMouseCallback("test", on_mouse);
while (1) {
cvCopy(t, img);
if (ok)
cvPutText(img, c, point, &cvFont(1), CV_RGB(255, 255, 255));
cvShowImage("test", img);
char a = cvWaitKey(10);
//回车
if (a == 13) enter = 1;
//删除,但要判断是否越下界
else if (a == 8) {
if (strlen(c))
c[strlen(c) - 1] = '\0';
}
else if (a == 27)
break;
//确定是否是初始字符'|'
else if (enter&&c == "|"&&a < 126 && a>32) {
char b[2] = { a,'\0' };
c = (char*)malloc(sizeof(char) * 2);
strcpy(c, b);
}
//可显示字符,增加到c之后
else if (enter&&a < 126 && a>32) {
char b[2] = { a,'\0' };
strcat(c, b);
}
}
return 0;
}