5.鼠标画图
//------------------------【头文件、命名空间包含部分】--------------------------
// 描述:包含程序锁使用的头文件和命名空间
//--------------------------------------------------------------------------------
#include<opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "程序窗口"
//--------------------------全局函数声明部分-------------------------------3
//---------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void *param);
void DrawRectangle( Mat& img, Rect box );
void showHelpText();
//--------------------------全局变量声明-----------------------------------
//
//-------------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;
//RNG g_rng(12345);
RNG g_rng((int)time(0));
//------------------------------main---------------------------------------
//
//--------------------------------------------------------------------------
int main(int argc, char**argv){
//1.
g_rectangle = Rect(-1,-1,0,0);
Mat srcImage(600,800,CV_8UC3),tempImage;
srcImage.copyTo(tempImage);
//g_rectangle = Rect(-1,-1,0,0);
//srcImage = Scalar::all(0);
srcImage = Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255));
//2.
namedWindow( WINDOW_NAME );
setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
//3.
while(1){
srcImage.copyTo(tempImage);
if( g_bDrawingBox ){
DrawRectangle( tempImage, g_rectangle );
}
//imshow( WINDOW_NAME, tempImage );
if( waitKey() == 27 ){
//break;
return 0;
}
//}
//return 0;
}
//-----------------------------on_MouseHandle()函数------------------------------
//
//--------------------------------------------------------------------------------
void on_MouseHandle( int event, int x, int y, int flags, void *param ){
Mat &image = *(Mat*) param;
switch( event ){
case EVENT_MOUSEMOVE:
{
if( g_bDrawingBox ){
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;
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 );
//imshow(WINDOW_NAME, image );
}
break;
}
}
//-------------------------DrawRectangle()------------------------
//
//----------------------------------------------------------------
void DrawRectangle( Mat& img, Rect box ){
//rectangle( img, box.tl(), box.br()-Point(1,1), Scalar( g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255)));
rectangle( img, box, Scalar( g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255)));
//rectangle( img, box, Scalar( g_rng(12345),g_rng(12345),g_rng(12345)));
//rectangle( img, box, Scalar( g_rng((int)time(0)),g_rng((int)time(0)),g_rng((int)time(0))));
}
5.1程序解析
5.1.1 CV_<bit_depth>(S|U|F)C<number_of_channels>
http://blog.csdn.net/maweifei/article/details/512212591--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如 如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张 灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对 应的就是CV_8 2--S|U|F--S--代表---signed int---有符号整形 U--代表--unsigned int--无符号整形 F--代表--float---------单精度浮点型 3--C<number_of_channels>----代表---一张图片的通道数,比如: 1--灰度图片--grayImg---是--单通道图像 2--RGB彩色图像---------是--3通道图像 3--带Alph通道的RGB图像--是--4通道图像
5.1.2
至于函数需要怎么使用,看这个库文件,查找就可以有很详细的说明
http://docs.opencv.org/3.2.0/d3/d63/classcv_1_1Mat.html#a626fe5f96d02525e2604d2ad46dd574f5.1.3