关于鼠标操作
鼠标响应函数
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()函数: