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
声明:
int cvCreateTrackbar( const char* trackbar_name, const char* window_name,int* value, int count, CvTrackbarCallback on_change );
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的显示位置。
定义:
- <span style="font-size:14px;">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);
- }</span>
- <span style="font-size:14px;">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;
- }</span>
- <span style="font-size:14px;">#ifndef CV_IMPL
- # define CV_IMPL CV_EXTERN_C
- #endif</span>
- <span style="font-size:14px;">
- </span>
- <span style="font-size:18px;">//在创建的窗体中创建一个滑动条控件
- <span style="white-space: pre;"> </span>char TrackbarName[50];
- <span style="white-space: pre;"> </span>sprintf( TrackbarName, "透明值 %d", g_nMaxAlphaValue );
- </span>
- <span style="font-size:18px;">createTrackbar( TrackbarName, WINDOW_NAME,<span style="color:#ff0000;"> &g_nAlphaValueSlider</span>, g_nMaxAlphaValue,<span style="background-color: rgb(192, 192, 192);"> <span style="color:#000099;">on_Trackbar</span></span> );</span>
- <span style="font-size:18px;">//结果在回调函数中显示
- <span style="white-space:pre"> </span><span style="background-color: rgb(153, 153, 153);">on_Trackbar</span>( g_nAlphaValueSlider, 0 );
- </span>
- <span style="font-size:18px;">void <span style="background-color: rgb(192, 192, 192);">on_Trackbar</span>( int,<span style="color:#3333ff;"> void* </span>)
- {
- <span style="white-space:pre"> </span>//求出当前alpha值相对于最大值的比例
- <span style="white-space:pre"> </span>g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue ;
- <span style="white-space:pre"> </span>//则beta值为1减去alpha值
- <span style="white-space:pre"> </span>g_dBetaValue = ( 1.0 - g_dAlphaValue );
-
-
- <span style="white-space:pre"> </span>//根据alpha和beta值进行线性混合
- <span style="white-space:pre"> </span>addWeighted( g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
-
-
- <span style="white-space:pre"> </span>//显示效果图
- <span style="white-space:pre"> </span>imshow( WINDOW_NAME, g_dstImage );
- }</span>
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:传给回调函数的参数
- <span style="font-size:14px;">void cv::setMouseCallback( const String& windowName, MouseCallback onMouse, void* param)
- {
- cvSetMouseCallback(windowName.c_str(), onMouse, param);
- }</span>
- <span style="font-size:14px;">CV_IMPL void
- cvSetMouseCallback( const char*, CvMouseCallback, void* )
- {
- CV_NO_GUI_ERROR( "cvSetMouseCallback" );
- }</span>
- <span style="font-size:18px;">setMouseCallback(WINDOW_NAME,<span style="color:#ff0000;">on_MouseHandle</span>,(void*)&srcImage);</span>
//鼠标响应函数- <span style="font-size:14px;">void<span style="color:#ff0000;"> on_MouseHandle</span>(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;
- }
- //调用函数进行绘制
- <span style="color:#ff0000;">DrawRectangle</span>( image, g_rectangle );
- }
- break;
-
-
- }
- }</span>
//描述:自定义的矩形绘制函数- <span style="font-size:18px;">void <span style="color:#ff0000;">DrawRectangle</span>( cv::Mat& img, cv::Rect box )
- {
- cv::rectangle(img,<span style="color:#ff0000;">box.tl</span>(),<span style="color:#ff0000;">box.br</span>(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色
- }</span>
- template<typename _Tp> inline
- Point_<_Tp> Rect_<_Tp>::<span style="color:#ff0000;">tl()</span> const
- {
- return Point_<_Tp>(x,y);
- }
- template<typename _Tp> inline
- Point_<_Tp> Rect_<_Tp>::<span style="color:#ff0000;">br</span>() const
- {
- return Point_<_Tp>(x + width, y + height);
- }
void on_Mouse(int event, int x, int y, int flags, void* param);
- event是 CV_EVENT_*变量之一
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
附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
#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
0 0