您的位置:首页 > 运维架构

学习OpenCV第四章第五题答案

2014-08-21 15:59 176 查看
本答案只实现了画矩形和点击右键实现橡皮擦功能,其他画椭圆画元的功能和画矩形一样,自己实现吧!

// learningOpenCV_4_5.cpp : 定义控制台应用程序的入口点。
//

CvRect box;

bool t=0,z=0;
CvPoint pt[2];
void my_mouse_callback(int event,int x,int y,int flags,void *prarm);
void draw_box(IplImage* image,CvRect box);
void draw_line(IplImage* image,CvPoint* p);
void erase(IplImage* image ,CvRect box);

int _tmain(int argc, _TCHAR* argv[])
{

IplImage* image=cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,3);
IplImage* copyimg=cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,3);
cvZero(image);
cvNamedWindow("show");
cvSetMouseCallback("show",my_mouse_callback,(void*)image);

while(1)
{
cvCopy(image,copyimg);
if(t==1)
draw_box(copyimg,box);
if(z==1)
erase(copyimg ,box);

cvShowImage("show",copyimg);
char c=cvWaitKey(33);
if(c==27)
break;
}
cvShowImage("show",image);
cvWaitKey(0);
return 0;
}

void my_mouse_callback(int event,int x,int y,int flags,void *prarm)
{
IplImage* image=(IplImage*)prarm;
switch(event)
{
case CV_EVENT_MOUSEMOVE:
{
if(t==1)
{
box.width=x-box.x;
box.height=y-box.y;
}

};break;
case CV_EVENT_LBUTTONDOWN:
{
t=true;
box=cvRect(x,y,0,0);
};break;
case CV_EVENT_LBUTTONUP:
{
t=false;
draw_box(image,box);
};break;
case CV_EVENT_RBUTTONDOWN:
{
z=1;
box=cvRect(0,0,0,0);
box=cvRect(x,y,x+20,y+20);
};break;
case CV_EVENT_RBUTTONUP:
{
z=0;
erase(image ,box);
};break;
}
}
void draw_box(IplImage* image,CvRect box)
{
cvRectangle(image,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),CV_RGB(255,0,0));
cvShowImage("show",image);
}
void draw_line(IplImage* image,CvPoint* p)
{
cvLine(image,(*p),*(p+1),CV_RGB(0,0,0),20);
cvShowImage("show",image);
}
void erase(IplImage* image ,CvRect box)
{
for(int i=box.y;i<box.height;i++)
{
for(int j=box.x;j<box.width;j++)
{
char *ptr=(char*)(image->imageData+i*image->widthStep)+j*3;
*ptr=0;
*(ptr+1)=0;
*(ptr+2)=0;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: