1. 创建一个程序, 可以新建图像, 像素置为0(黑), 通过选择左键画直线, 圆, 矩形, 右键实现橡皮擦功能.
贪玩的我又玩了一个早上. -。-!!
编译环境: Ubuntu 12.04, qt-4.8.1, opencv 2.4.2
代码:
#include <cv.h>
#Include <highgui.h>
#include <cmath>
// 设置一些滑动条
int select_slider = 0, selectSituation = 1;
//选择画图类型
int R = 0, G = 0, B = 0, R_slider = 0, G_slider = 0, B_slider = 0; //颜色调配
int sx = 0, sy = 0, ex = 0, ey = 0; //鼠标点下起点和终点.
int cx, cy, sizeClear_slider = 0, sizeClear = 0; //橡皮擦(矩形)
CvRect box;
//鼠标相应回调函数
void my_mouse_callback(int event, int x, int y, int flags, void *param);
bool drawing = false, drawingClear = false;
//一系列滑动条函数
void R_callback(int pos)
{
R = pos;
}
void G_callback(int pos)
{
G = pos;
}
void B_callback(int pos)
{
B = pos;
}
void select_callback(int pos)
{
selectSituation = pos;
}
void sizeClear_callback(int pos)
{
sizeClear = pos;
}
//橡皮擦函数
void Clear(IplImage *img, int x, int y)
{
for(int i = x-sizeClear; i <= x+sizeClear; ++i)
{
for(int j = y-sizeClear; j <= y+sizeClear; ++j)
cvLine(img, cvPoint(i,j), cvPoint(i,j), CV_RGB(255,255,255));
}
}
//画图
void drawingImage(IplImage *img, CvRect box)
{
switch( selectSituation )
{
case 0:{
cvCircle(img,
cvPoint( (sx+ex)/2, (sy+ey)/2 ),
(int)sqrt( (sx-ex)*(sx-ex)*1.0+(sy-ey)*(sy-ey)*1.0 )/2,
CV_RGB(R,G,B),
1, 8, 0);
}
break;
case 1:{
cvRectangle(img,
cvPoint(box.x, box.y),
cvPoint(box.x+box.width, box.y+box.height),
CV_RGB(R,G,B));
}
break;
case 2:{
cvLine(img,
cvPoint(sx, sy),
cvPoint(ex, ey),
CV_RGB(R,G,B));
}
break;
}
}
int main(int argc, char *argv[])
{
IplImage *image = cvCreateImage(cvSize(1000,1000), IPL_DEPTH_8U, 3);
cvZero(image);
IplImage *temp = cvCloneImage(image);
cvNamedWindow("test");
cvSetMouseCallback("test", my_mouse_callback, (void*)image);
cvCreateTrackbar("Ploy", "test", &select_slider, 2, select_callback);
cvCreateTrackbar("R", "test", &R_slider, 255, R_callback);
cvCreateTrackbar("G", "test", &G_slider, 255, G_callback);
cvCreateTrackbar("B", "test", &B_slider, 255, B_callback);
cvCreateTrackbar("sizeClear", "test", &sizeClear_slider, 20, sizeClear_callback);
while( 1 )
{
cvCopyImage(image, temp);
if( drawing ) drawingImage(temp, box);
cvShowImage("test", temp);
//esc键退出
if( (char)cvWaitKey(15) == 27 ) break;
}
cvReleaseImage(&image);
cvReleaseImage(&temp);
cvDestroyWindow("test");
return 0;
}
//鼠标响应回调函数
void my_mouse_callback(int event, int x, int y, int flags, void *param)
{
IplImage *img = (IplImage *)param;
switch( event )
{
case CV_EVENT_MOUSEMOVE:{
if( drawing && !drawingClear)
{
ex = x;
ey = y;
box.width = x-box.x;
box.height = y-box.y;
}
else if( !drawing && drawingClear)
{
cx = x;
cy = y;
Clear(img, cx, cy);
}
}
break;
case CV_EVENT_LBUTTONDOWN:{
drawing = true;
sx = ex = x;
sy = ey = y;
box = cvRect(x, y, 0, 0);
}
break;
case CV_EVENT_LBUTTONUP:{
drawing = false;
ex = x;
ey = y;
if(box.width < 0)
{
box.x += box.width;
box.width *= -1;
}
if(box.height < 0)
{
box.y += box.height;
box.height *= -1;
}
drawingImage(img, box);
sx = sy = ex = ey = 0;
}
break;
case CV_EVENT_RBUTTONDOWN:{
drawingClear = true;
drawing = false;
cx = x;
cy = y;
}
break;
case CV_EVENT_RBUTTONUP:{
Clear(img, cx, cy);
drawingClear = false;
}
break;
}
}
结果截图: