5.4-OpenCV学习(2)

关于鼠标操作
鼠标响应函数

void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

    Mat& image = *(cv::Mat*) param;
    switch( event)
    {
        //鼠标移动消息
    case EVENT_MOUSEMOVE: 
        {
            if( g_bDrawingBox )//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
            {
                g_rectangle.width = x-g_rectangle.x;
                g_rectangle.height = y-g_rectangle.y;
            }
        }
        break;

        //左键按下消息
    case EVENT_LBUTTONDOWN: 
        {
            g_bDrawingBox = true;
            g_rectangle =Rect( x, y, 0, 0 );//记录起始点
        }
        break;

        //左键抬起消息
    case EVENT_LBUTTONUP: 
        {
            g_bDrawingBox = false;//置标识符为false
            //对宽和高小于0的处理
            if( g_rectangle.width < 0 )
            {
                g_rectangle.x += g_rectangle.width;
                g_rectangle.width *= -1;
            }

            if( g_rectangle.height < 0 ) 
            {
                g_rectangle.y += g_rectangle.height;
                g_rectangle.height *= -1;
            }
            //调用函数进行绘制
            DrawRectangle( image, g_rectangle );
        }
        break;

    }
}

其中 int event,鼠标操作时间的整数代号,在opencv2.4.5中,event鼠标事件总共有10中,从0-9依次代表如下:
Event:
#define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击
#define CV_EVENT_RBUTTONDOWN 2 右键点击
#define CV_EVENT_MBUTTONDOWN 3 中间点击
#define CV_EVENT_LBUTTONUP 4 左键释放
#define CV_EVENT_RBUTTONUP 5 右键释放
#define CV_EVENT_MBUTTONUP 6 中间释放
#define CV_EVENT_LBUTTONDBLCLK 7 左键双击
#define CV_EVENT_RBUTTONDBLCLK 8 右键双击
#define CV_EVENT_MBUTTONDBLCLK 9 中间释放

cvtCol*or()函数:颜色空间转换函数
*cvtColor(yuantu, gr*ay, COLOR_BGR2GRAY)*;//灰度图
绘制图像:包括画圆,画椭圆等等,很简单,就不举例子了
颜色空间:主要就是Inew=(I/10)*10,I是int类型,会自动向下取整
计时:getTickCount():记录起始时间,自某个动作开始以来的时钟周期数
getTickFrequency():一秒钟走的时钟周期数,如下

double time0 = static_cast<double>(getTickCount());//强制转换为double型
time0 = ((double)getTickCount() - time0) / getTickFrequency();//(double)是先cast 后面的类型为double
cout << time0 << endl;//输出运行用时

访问像素
最快的就是用指针

//【1】创建原始图并显示
    Mat srcImage = imread("lena.jpg");
    imshow("ada", srcImage);

    //【2】按原始图的参数规格来创建创建效果图
    Mat dstImage;
    dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同 
    //rows是行,cols是列
    //ShowHelpText();

    //【3】记录起始时间
    double time0 = static_cast<double>(getTickCount());

    //【4】调用颜色空间缩减函数
    colorReduce(srcImage, dstImage, 32);

    //【5】计算运行时间并输出
    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "\t此方法运行时间为: " << time0 << "秒" << endl;  //输出运行时间

                                                     //【6】显示效果图
    imshow("效果图", dstImage);

    waitKey(0);
    }
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
    //参数准备
    outputImage = inputImage.clone();  //拷贝实参到临时变量
    int rowNumber = outputImage.rows;  //行数
    int colNumber = outputImage.cols*outputImage.channels();  //列数 x 通道数=每一行元素的个数

                                                              //双重循环,遍历所有的像素值
    for (int i = 0; i < rowNumber; i++)  //行循环
    {
        uchar* data = outputImage.ptr<uchar>(i);  //获取第i行的首地址,ptr是返回第i行的首地址
        for (int j = 0; j < colNumber; j++)   //列循环
        {
            // ---------【开始处理每个像素】-------------     
            data[j] = data[j] / div*div + div / 2;
            //或者可以写成*data++ = *data/div*div +div/2;
            // ----------【处理结束】---------------------
        }  //行处理结束
    }
}

ROI:Rect方法:imageROI = image(Rect(x, y, ROI.cols, ROI.rows));
!!!!注意,在画矩形是,Rect是(x,y,wid,hei),但是在这个里面是(x,y,长,宽)!!!
copyto:A.CopyTo(B),A得是灰度图
addWeighted()函数:这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值