opencv 函数(一)

本文介绍了OpenCV中的图像叠加方法addWeighted,详细解释了参数含义并给出了示例。接着讲解了创建滑动条createTrackbar的功能和使用方法,以及如何获取和设置trackbar位置。最后讨论了鼠标操作setMouseCallback,阐述了其在窗口中响应鼠标事件的作用和参数详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的显示位置。

定义:

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);
}

  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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值