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

  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 )
      {
      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;
      }
}

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值