用鼠标在窗口中画方形

//用鼠标在窗口中画方形
//作者:sandy
//时间:2015-10-7

//user can draw boxes on the screen
#include <cv.h>
#include <highgui.h>
using namespace std;

CvRect box;
bool drawing_box=false;

//定义一个回调函数
//define our callback which we will install for mouse event
//
void my_mouse_callback(int event ,int x,int y,int flags,void* param);

//实现把方形画在一幅画上的小程序
//A little subroutine to draw a box into an image
//
void draw_box(IplImage* img ,CvRect rect);

int main(int argc,char* argv[]){

    box=cvRect(-1,-1,0,0);//(x,y,width,height)

    IplImage* image=cvCreateImage(cvSize(400,400),IPL_DEPTH_8U,3);//创建一个图像(画板)
    cvZero(image);//将数组中的所有通道的元素的值都设置为0.
    IplImage* temp=cvCloneImage(image);//image克隆到temp

    cvNamedWindow("mouse_rect_window");//定义一个视窗

    //在opencv中注册回调函数,传入图像参数,以便特定窗口被触发鼠标事件后,opencv可以正确调用
    //
    cvSetMouseCallback("mouse_rect_window",my_mouse_callback,(void*) image);//触发窗口为:mouse_rect_window,触发调用函数为:my_mouse_callback,传给触发调用函数的void * param值为(void*) image

    //The main program loop.here we copy the working image to the ‘temp‘ image,
    //and if the user is drawing , then put the currently contemplated box onto the
    //temp image.Display the temp image,and wait 15ms for a keystroke,then repeat...
    //
    while(1){
        cvCopyImage(image,temp);//把image复制到temp中
        if(drawing_box) draw_box(temp,box);
        cvShowImage("mouse_rect_window",temp);

        if(cvWaitKey(15)==27) break;
    }

    cvReleaseImage(&image);
    cvReleaseImage(&temp);
    cvDestroyWindow("mouse_rect_window");
}

//鼠标响应事件
void my_mouse_callback(int event ,int x,int y,int flags,void* param){
    IplImage* image=(IplImage*)param;

    switch(event){

        case CV_EVENT_MOUSEMOVE:{
            if(drawing_box){
                box.width=x-box.x;
                box.height =y-box.y;
                //cout<<x<<‘,‘<<y<<endl;
                //cout<<box.x<<‘,‘<<box.y<<endl;
            }
        }
        break;
        case CV_EVENT_LBUTTONDOWN:{
            drawing_box=true;
            box=cvRect(x,y,0,0);//起点坐标,宽,高
            //cout<<x<<‘,‘<<y<<endl;
            //cout<<box.x<<‘,‘<<box.y<<endl;
        }
        break;
        case CV_EVENT_LBUTTONUP:{
            drawing_box=false;
            if(box.width<0){
                box.x +=box.width ;
                box.width  *=-1;
            }
            if(box.height<0){
                box.y +=box.height ;
                box.height *=-1;
            }
            draw_box(image,box);
        }
        break;

    }
}
//实现把方形画在一幅画上的小程序
//A little subroutine to draw a box into an image
//
void draw_box(IplImage* img ,CvRect rect){
    cvRectangle(
        img,
        cvPoint(box.x ,box.y),
        cvPoint(box.x +box.width,box.y +box.height),
         cvScalar(0, 120, 255)//画线的颜色
        );
}

时间: 2024-08-26 21:38:50

用鼠标在窗口中画方形的相关文章

用鼠标在窗口中画方形的程序

#include <cv.h> #include <highgui.h> void my_mouse_callback(int event, int x, int y, int flags, void* param); CvRect box; bool drawing_box = false; void draw_box(IplImage *img, CvRect rect) { cvRectangle(img, cvPoint(box.x, box.y), cvPoint(box

非激活窗口中响应鼠标滚动之理论篇

在最近工作中有一个优化交互的需求,分析后得知,其核心功能为能在非激活窗口中响应鼠标滚动消息,先就该需求进行前期方案验证. 同类产品实现 参照现有软件行为,操作系统为Win7.以notepad++,Chrome两款软件为例. 当鼠标选中notepad++后,然后将鼠标转移到Chrome界面后,上下滚动鼠标,Chrome页面能够同步滚动. 当鼠标选中Chrome后,然后将鼠标转移到Notepad++界面,上下滚动,Notepad++不能同步滚动. 猜测是Chrome对滚轮滚动消息进行了额外处理.既然

jQ禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突

1. 禁止右键点击 代码如下: $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 代码如下: $(document).ready(function() { $("input.text1").val("Enter your search text here"); textFill($

如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主窗口有菜单.工具条等,想用鼠标绘图, 把鼠标轨迹映射到窗口部件上,这些问题. 其实最主要的是获得窗口部件的起始点相对主窗口的位置. 例如:在主窗口拖入一个QScrollArea 在其上放一个QLabel用来显示鼠标事件. 可以在ui对象结构上看到如下结构. 大家知道,我们可以用pos()来获得某一窗

在窗口中绘画

// 鼠标绘图 #include <opencv2/opencv.hpp> using namespace std; //#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") const char *pstrWindowsMouseDrawTitle = "鼠标绘图窗口"; /** 鼠标事件响应采用回调函数的方式处理,

1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

 1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets printsupport B  编写MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H   #include <QWidget> #include <QGraphicsScene> #include <QGraphicsLineItem>

JAVA程序设计(12.2)---- 多态、监听器初级应用:在窗口中绘制图形,可以选择圆形 正方形 线条

1.在800 *800 的窗口中加入3个按钮 可以选择当前的画笔画出什么样的图形 有圆 正方形 直线 三种 JFrame 监听器使用 内部类 匿名内部类 接口 多态 1.先做所有图形的抽象类 package com.lovo.homework; import java.awt.Color; import java.awt.Graphics; /** * 抽象类:图形 * @author Abe * 属性:起点坐标 终点坐标 颜色 */ public abstract class Figure {

MFC抓取鼠标所在窗口HWND

抓取窗口HWND 1. 通过API: WindowFromPoint可以抓取指定位置的HWND: hWnd = ::WindowFromPoint(pt); 2.  要抓取其它窗口的位置,需要调用API,否则鼠标一旦移出了本窗口,消息就走到窗口中了 ::SetCapture(); 3.  抓取结束,调用Windows API释放消息绑定 ::ReleaseCapture(); 4.  在此过程中如果要更新鼠标的形状等的话,需要继承OnSetCursor if(抓取过程) { ::SetCurso

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var