鼠标响应绘图

问题:

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


#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;   
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值