//时间:2015年7月21日
//修改:由于昨天时间比较匆忙,今日将程序中的bug和语句理解进行注释
//附:由于最近放暑假一些事情耽误,所以这段时间没有更新程序
//时间:2015年7月20日//功能:实现简单地画板功能
//函数:void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param=NULL );
// 获取鼠标响应,
//参数说明:window_name 窗口的名字。
// on_mouse 指定窗口里每次鼠标事件发生的时候,被调用的函数指针。
//附:由于最近放暑假一些事情耽误,所以这段时间没有更新程序
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
IplImage * m_pic = 0 , * m_pic1 = 0;
CvPoint m_prev_pt = {1 , -1};
void m_on_mouse(int m_event , int m_x , int m_y , int m_flags , void* )
{
if (!m_pic)
{
return;
}
if (m_event == CV_EVENT_LBUTTONUP||(!m_flags)) //当放开鼠标左键或者鼠标左键没摁下时复原初始点
{
m_prev_pt = cvPoint(-1 , -1);
//printf("%d %d %d\n" , m_flags , m_prev_pt.x , m_prev_pt.y);
}
else if (m_event == CV_EVENT_LBUTTONDOWN) //当鼠标左键摁下时记录摁下点的位置
{
m_prev_pt = cvPoint(m_x , m_y);
//printf("%d %d %d\n" , m_flags , m_prev_pt.x , m_prev_pt.y);
}
else if(m_event == CV_EVENT_MOUSEMOVE && (m_flags&CV_EVENT_FLAG_LBUTTON)) //当鼠标摁下左键并且移动时
{
CvPoint m_pt = cvPoint(m_x , m_y);
//printf("%d %d %d\n" , m_flags , m_prev_pt.x , m_prev_pt.y);
if(m_prev_pt.x <0)
{
m_prev_pt = m_pt;
}
cvLine(m_pic , m_prev_pt , m_pt , cvScalarAll(255) , 3 , 8 , 0 );
m_prev_pt = m_pt;
cvShowImage("m_pic",m_pic);
}
}
int main()
{
char * filename = "华山.jpg";
if( ( m_pic = cvLoadImage(filename , -1) ) == 0)
{
return 0 ;
}
cvNamedWindow("m_pic",1);
m_pic1 = cvCloneImage( m_pic );
cvShowImage( "m_pic" , m_pic );
cvSetMouseCallback( "m_pic" , m_on_mouse , 0 ); //调用鼠标回调函数m_on_mouse
while(true)
{
int c = cvWaitKey(0);
if((char)c == 27)
{
break;
}
if((char)c == 'r')
{
cvCopy(m_pic , m_pic1);
cvShowImage("m_pic" , m_pic);
}
}
return 0;
}