《学习OpenCV》第四章第6题

来源:互联网 发布:同花顺期货模拟软件 编辑:程序博客网 时间:2024/06/05 07:45

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

#include<iostream>#include"highgui.h"#include"cv.h"using namespace std;using namespace cv;#define WIDTH 512#define HEIGHT 512IplImage *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;}
原创粉丝点击