《学习OpenCV》第四章第6题

写一个程序,使其创建一幅图像,然后将图像所有像素值置为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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值