用鼠标在窗口中画方形的程序------基于OpenCV+VS

本文介绍如何利用OpenCV库和Visual Studio(VS)开发一个允许用户在窗口上绘制矩形的程序。通过这个教程,你将学习到OpenCV的基本图形绘制功能以及与VS的集成技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*---------------------------------------------------------------------------------------------------------------- 
*程序说明: 
*       基于Opencv实现-----鼠标事件(利用鼠标在窗口画矩形) 
*开发环境: 
*       win7+vs2010+opencv2.4.8  
*创建时间地点: 
*       陕西师范大学   2017.3.20 
*参考信息: 
*       Learning OpenCV 
*作者: 
*       李先生 
------------------------------------------------------------------------------------------------------------------*/  
#include<opencv2\highgui\highgui.hpp>  
#include<cv.h>  
using namespace cv;  
  
/*------------------------------------------------------------------------------------------------------------------ 
*   宏定义 
-------------------------------------------------------------------------------------------------------------------*/  
CvRect   box;  
bool     drawing_box = false;  
  
/*------------------------------------------------------------------------------------------------------------------ 
*函数功能: 
*       画图函数 
*参数:     
*       IplImage* img;  画图的位置,及在那个图片上画图 
*       CvRect rect     画图的参数信息 
-------------------------------------------------------------------------------------------------------------------*/  
void draw_box(IplImage* img,CvRect rect)  
{  
    cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));/*red*/  
}  
  
/*------------------------------------------------------------------------------------------------------------------ 
*函数功能: 
        定义回掉函数my_mouse_callback(); 
*参数: 
        int event;      第一个参数必须是鼠标事件类型 
        int x;          事件发生时鼠标的横坐标位置 
        int y;          事件发生时纵坐标的位置 
        int flags;      每一位制定了事件发生时的不同状态 
        void* param;    额外参数信息 
-------------------------------------------------------------------------------------------------------------------*/  
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.height = x-box.x;  
                    box.width  = y-box.y;  
                }  
            }  
            break;  
        case CV_EVENT_LBUTTONDOWN:  
            {  
                drawing_box=true;  
                box = cvRect(x,y,0,0);  
            }  
            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;  
    }  
}  
  
  
/******************************************************************************************************************** 
*函数功能: 
        主函数,我们的程序从这里开始运行 
********************************************************************************************************************/  
int main(int argc,char* argv[])   
{  
    box              =  cvRect(-1,-1,0,0);                                  //创建一个矩阵  
    IplImage* image  =  cvCreateImage(cvSize(800,800),IPL_DEPTH_8U,3);      //创建一副图片  
    cvZero(image);                                                          //图片矩阵的元素全部置0  
    IplImage* temp   =  cvCloneImage(image);                                //克隆一个临时图片  
  
    cvNamedWindow("Box Example");                                           //创建一个显示窗口  
  
    cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image);      //调用OpenCV中的实现注册函数,  
                                                                            //这个函数是OpenCV函数库的函数  
    while(1)  
    {  
        cvCopyImage(image,temp);   //这一步很重要,但是我现在还是说不清楚它的含义,有看过博客且明白的高手并且有时间请指教,没加这句,显示结果是图二  
        if(drawing_box)           
            draw_box(temp,box);  
        cvShowImage("Box Example",temp);  
  
        if(cvWaitKey(15)==27)break;  
    }  
  
    cvReleaseImage(&image);  
    cvReleaseImage(&temp);  
    cvDestroyWindow("Box Example");  
}  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值