兴趣学习: opencv 实现画图程序

来源:互联网 发布:win7如何安装linux系统 编辑:程序博客网 时间:2024/06/07 18:48
 opencv 实现画图程序
           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 )
    {
    case0:{
       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;
    case1:{
       cvRectangle(img,
                   cvPoint(box.x, box.y),
                   cvPoint(box.x+box.width, box.y+box.height),
                   CV_RGB(R,G,B));
    }
       break;
    case2:{
       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");
    return0;
}

//鼠标响应回调函数
void my_mouse_callback(int event, int x, int y, int flags, void*param)
{
    IplImage*img = (IplImage *)param;
    switch(event )
    {
    caseCV_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;
    caseCV_EVENT_LBUTTONDOWN:{
           drawing = true;
           sx = ex = x;
           sy = ey = y;
           box = cvRect(x, y, 0, 0);
       }
       break;
    caseCV_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;
    caseCV_EVENT_RBUTTONDOWN:{
       drawingClear = true;
       drawing = false;
       cx = x;
       cy = y;
    }
       break;
    caseCV_EVENT_RBUTTONUP:{
       Clear(img, cx, cy);
       drawingClear = false;
    }
       break;
    }
}

结果截图:
兴趣学习: <wbr>opencv <wbr>实现画图程序


0 0
原创粉丝点击