鼠标响应绘图

原创 2012年03月29日 17:45:24

问题:

这个相当于是画点,移动快了就不连续了。


#include <cv.h>
#include <highgui.h>

void my_mouse_callback(
	int event, int x, int y, int flags, void* param 
	);

CvPoint p = cvPoint(0,0);
CvPoint q = cvPoint(0,0);
int thickness=3;
bool draw_line = false;

void drawingline( IplImage* img, CvPoint p, CvPoint q ) {
	cvLine (
		img, 
		cvPoint(p.x,p.y),
		cvPoint(q.x,q.y),
		cvScalar(0xff,0xff,0x00),    
		thickness
		);
}

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

	IplImage* image = cvCreateImage( 
		cvSize(600,500),
		IPL_DEPTH_8U,
		3
		);
	cvZero( image );
	cvNamedWindow( " Example" );

	cvSetMouseCallback( 
		" Example", 
		my_mouse_callback, 
		(void*) image 
		);
	while( 1 ) {
		if( draw_line ) drawingline( image, p , q ); 
		cvShowImage( " Example", image );
		if( cvWaitKey( 15 )==27 ) break;
	}

	cvReleaseImage( &image );
	cvDestroyWindow( " Example" );
}

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( draw_line ) {
		p.x = x;
		p.y = y;
		q = p;
		}
	 }
	break;
	case CV_EVENT_LBUTTONDOWN: {
		draw_line = true;
	    drawingline( image, p, q );
	   }
	break;   
	case CV_EVENT_LBUTTONUP: {
		draw_line = false; 
		drawingline( image, p, q );
	   }
	break;   
	}
}

画连续的线需要改进:

mousemove状态下,画一下段线段后,把终点赋给起点。这样每次经过一个cpu事件就画出一条小线段。(经过一个cpu时间,计算机进行一次采样)。


修改后的代码

#include <cv.h>
#include <highgui.h>

void my_mouse_callback(
	int event, int x, int y, int flags, void* param 
	);

CvPoint p;
CvPoint q;
int thickness=3;
bool draw_line = false;
IplImage* temp = NULL;

void drawingline( IplImage* img, CvPoint p, CvPoint q ) {
	cvLine (
		img, 
		cvPoint(p.x,p.y),
		cvPoint(q.x,q.y),
		cvScalar(0xff,0xff,0x00),    
		thickness
		);
}

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

	IplImage* image = cvCreateImage( 
		cvSize(600,500),
		IPL_DEPTH_8U,
		3
		);

	cvZero( image );
	cvNamedWindow( "Example" );

	cvSetMouseCallback( 
		"Example", 
		my_mouse_callback, 
		(void*) image 
		);
	
	while( 1 ) {  
		if ( draw_line )
			drawingline( image, p , q );   
		cvShowImage( "Example", image );  
		if( cvWaitKey( 15 )==27 ) break;  
	}  
	cvWaitKey(-1);

	cvReleaseImage( &image );
//	cvReleaseImage( &temp );
	cvDestroyWindow( "Example" );
}

void my_mouse_callback(
	int event, int x, int y, int flags, void* param )
{

	IplImage* image = (IplImage*) param;
	
	switch( event ) 
	{
	case CV_EVENT_LBUTTONDOWN: {
		draw_line = true;
		p.x = x;
		p.y = y;
	    q = p;
		drawingline( image, p , q ); 
							   }
	break; 
	case CV_EVENT_MOUSEMOVE: {
		if( draw_line ) {
			q.x = x;
			q.y = y;
			drawingline( image, p , q );
			p = q;
		}
	 }
	 break;

	case CV_EVENT_LBUTTONUP: {
		draw_line = false; 
	    }
	break;   
	}
}


相关文章推荐

在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法

在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法   [MXDRAW CAD控件文档]   下面帮助的完整例子,在控件安装目录的Sample\Ie\iedemo.htm中.   ...

asp.net 鼠标绘图源码

  • 2009年11月16日 20:53
  • 2KB
  • 下载

c# 鼠标绘图 并保存到本地

  • 2009年03月16日 10:31
  • 404KB
  • 下载

flash as3 鼠标绘图

本文用AS3分别描绘了曲线、直线、圆、椭圆和矩形5种绘制方法,希望能给大家带来帮助! (1):曲线 知识点: 1、添加鼠标监听事件MouseEvent; 2、规定画布大小; 3、moveTo...

Lufylegend库学习笔记1 绘图操作及鼠标事件

这几天对于网页前端有点兴趣,学习了一下Canvas的相关知识。 看到Lufylegend库之后,感觉很棒,有一种在写AS的感觉。今天入门第一站,写了一个画板。 是一个非常简易的画板,但是可以看到一些重...

[vb.net]使用GDI+绘图达到图片随鼠标缩放与移动的效果

[vb.net]使用GDI+绘图达到图片随鼠标缩放与移动的效果近日需要在软件中加入对图片的浏览功能,类似地图的拖拽及缩放操作。 网上大部分教程写的不够详细,对于初学者来讲不易理解。总结下要点,有二: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:鼠标响应绘图
举报原因:
原因补充:

(最多只允许输入30个字)