opencv_c++学习(十三)

文章介绍了如何在OpenCV中创建滑动条以及设置鼠标事件响应。通过`createTrackbar`函数创建滑动条,并定义回调函数处理位置变化。同时,利用`setMouseCallback`添加鼠标事件监听,实现如图像标记等交互功能。
摘要由CSDN通过智能技术生成

一、创建滑动条

在这里插入图片描述

createTrackbar(const String & trackbarname, const String & winname, int* value, int count, onChange =, TrackbarCallback 0, void * userdata =0)

trackbarname:滑动条的名称。
winname:创建滑动条窗口的名称。
value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。
count:滑动条的最大取值。
onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo (int,void *) ;,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值。
userdata:传递给回调函数的可选参数。
滑动条创建样例如下:

//定义全局变量src
Mat src;

//回调函数,通过回调不断的显示新的图片
void callBack(int value, void*)
{
	float a = value / 100.0;
	Mat img2 = src * a;
	imshow("demo", img2);
}


int main() {

	src = imread("1.jpg");

	//显示图像
	namedWindow("demo");
	imshow("demo", src);

	//滑动条初始值
	int value = 100;

	//创建滑动条
	createTrackbar("百分比", "demo", &value, 600, callBack, 0);

	waitKey(0);
	return 0;
}

二、鼠标事件相应

setMouseCallback(const String & winname, MouseCallback onMouse,void * userdata = 0)

winname:添加鼠标响应的窗口的名字
onMouse:鼠标响应的回调函数。
userdata:传递给回调函数的可选参数。
回调函数:

typedef void(*cv::MouseCallback)(int event, int x, int y, int flags,void “userdata)

event:鼠标响应事件标志,参数为EVENT_*形式。
x:鼠标指针在图像坐标系中的x坐标。
y:鼠标指针在图像坐标系中的y坐标。
flags:鼠标响应标志,参数为EVENT_FLAG_*形式。
userdata:传递给回调函数的可选参数。
在这里插入图片描述
在这里插入图片描述
本节的样例如下:

Mat src;
Mat imgPoint;
Point prePoint;

void mouse(int event, int x, int y, int flags, void*)
{
	//如果单机右键
	if (event==EVENT_RBUTTONDOWN)
	{
		cout << "要使用左键" << endl;
	}

	//如果单机左键
	if (event == EVENT_LBUTTONDOWN)
	{
		prePoint = Point(x, y);
		cout << "起始坐标是" << prePoint << endl;
	}

	//鼠标按住左键移动
	if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
	{
		//绘制鼠标移动轨迹
		Point pt(x, y);

		//绘制直线
		line(src, prePoint, pt, Scalar(255, 255, 255), 2, 5, 0);

		//将当前位置信息赋值给前一时刻信息,方便下一时刻继续移动
		prePoint = pt;
		imshow("1", src);

		//通过改变图像像素显示鼠标移动轨迹
		imgPoint.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y, x - 1) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y, x + 1) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
		imshow("2", imgPoint);
	}
}

int main(){

	//读取图片
	src = imread("1.jpg");

	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}

	//拷贝读入的图像
	src.copyTo(imgPoint);
	imshow("1", src);
	imshow("2", imgPoint);

	//鼠标响应
	setMouseCallback("1", mouse, 0);
	waitKey(0);
	return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值