1、图像叠加addWeighted
声明:
addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma,
OutputArray dst, int dtype = -1);
src1 //第一个原数组.
alpha //第一个数组元素的权值
src2 //第二个原数组
beta //第二个数组元素的权值
dst //输出数组
gamma //添加的常数项。
函数 addWeighted 计算两数组的加权值的和:
dst(I)=src1(I)*alpha+src2(I)*beta+gamma
如:cv::addWeighted(image1,0.7,image2,0.9,0.,result);
说以说0.7和0.9分别代表两个图像在dst图像中占得比例,自定义,后面的0只是起一个微调作用。
Mat im=imread("2.jpg");
Mat lo=imread("6.jpg");
namedWindow("[2]op");
imshow("[2]op",im);
namedWindow("[3]op");
imshow("[3]op",lo);
Mat Roi,QQ;
Roi=im(Rect(200,10,150,230));
for(int i=0;i<Roi.rows;i++)
for(int j=0;j<Roi.cols;j++)
Roi.at<Vec3b>(i,j)=255;
QQ=lo(Rect(200,10,150,230));
addWeighted(Roi,0.5,QQ,0.3,0.,Roi);
namedWindow("[4]AP");
imshow("[4]AP",im);Mat im=imread("2.jpg");
2、创建滑动条createTrackbar
trackbar_name 被创建的trackbar名字。
window_name 窗口名字,这个窗口将为被创建trackbar的父对象。
value 整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。无值时为NULL。
count 滑块位置的最大值。最小值一直是0。
on_change 每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。
函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。
被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos来重新设置trackbar的显示位置。
定义:
int cv::createTrackbar(const String& trackbarName, const String& winName,
int* value, int count, TrackbarCallback callback,
void* userdata)
{
return cvCreateTrackbar2(trackbarName.c_str(), winName.c_str(),
value, count, callback, userdata);
}
CV_IMPL int
cvCreateTrackbar2( const char* /*trackbar_name*/, const char* /*window_name*/,
int* /*val*/, int /*count*/, CvTrackbarCallback2 /*on_notify2*/,
void* /*userdata*/ )
{
CV_NO_GUI_ERROR( "cvCreateTrackbar2" );
return -1;
}
#ifndef CV_IMPL
# define CV_IMPL CV_EXTERN_C
#endif
//在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf( TrackbarName, "透明值 %d", g_nMaxAlphaValue );
createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
//结果在回调函数中显示
on_Trackbar( g_nAlphaValueSlider, 0 );
void on_Trackbar( int, void* )
{
//求出当前alpha值相对于最大值的比例
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;
//则beta值为1减去alpha值
g_dBetaValue = ( 1.0 - g_dAlphaValue );
//根据alpha和beta值进行线性混合
addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//显示效果图
imshow( WINDOW_NAME, g_dstImage );
}
void 用在 函数 名前,表示没有返回值
用在函数参数列表中,表示没有形参
用在指针前,表示指针可以指向任何类型
3、鼠标操作setMouseCallback
声明:void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);- winname:窗口的名字
- onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
- userdate:传给回调函数的参数
void cv::setMouseCallback( const String& windowName, MouseCallback onMouse, void* param)
{
cvSetMouseCallback(windowName.c_str(), onMouse, param);
}
CV_IMPL void
cvSetMouseCallback( const char*, CvMouseCallback, void* )
{
CV_NO_GUI_ERROR( "cvSetMouseCallback" );
}
setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
//
鼠标响应函数
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;
}
}
//
描述:自定义的矩形绘制函数
void DrawRectangle( cv::Mat& img, cv::Rect box )
{
cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色
}
template<typename _Tp> inline
Point_<_Tp> Rect_<_Tp>::tl() const
{
return Point_<_Tp>(x,y);
}
template<typename _Tp> inline
Point_<_Tp> Rect_<_Tp>::br() const
{
return Point_<_Tp>(x + width, y + height);
}
- event是 CV_EVENT_*变量之一
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
#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
#define CV_EVENT_FLAG_LBUTTON 1
#define CV_EVENT_FLAG_RBUTTON 2
#define CV_EVENT_FLAG_MBUTTON 4
#define CV_EVENT_FLAG_CTRLKEY 8
#define CV_EVENT_FLAG_SHIFTKEY 16
#define CV_EVENT_FLAG_ALTKEY 32