OpenCV9-窗口交互操作

这篇具有很好参考价值的文章主要介绍了OpenCV9-窗口交互操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1.图像窗口滑动条

图像窗口滑动条就是显示在图像的窗口中,能够通过滑动改变数值的滑动条。OpenCV中使用createTrackbar函数在显示图像的窗口中创建滑动条:

int createTrackbar(
    const String& trackbarname,  // 滑动条的名称
    const String& winname,       // 图像显示的窗口名
    int* value,   // 滑动条的初始位置
    int count,    // 滑动条的最大取值
    TrackbarCallback onChange = 0, // 滑块更改位置时的回调函数
    void* userdata = 0 // 传递给回调函数的参数
);

// pos是轨迹栏位置,userdata是用户数据
typedef void (*TrackbarCallback)(int pos, void* userdata);

下面是拖动滑动条改变图像亮度的代码:

#include <opencv2\opencv.hpp>
#include <opencv2/core/utils/logger.hpp> // debug no log
#include <iostream>
using namespace cv;
using namespace std;

//为了能在被调函数中使用,所以设置成全局的
int value;
void callBack(int, void*);  //滑动条回调函数
Mat img1, img2;

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	img1 = imread("lena.png");
	if (!img1.data)
	{
		cout << "请确认是否输入正确的图像文件" << endl;
		return -1;
	}
	namedWindow("滑动条改变图像亮度");
	imshow("滑动条改变图像亮度", img1);
	value = 100;  //滑动条创建时的初值
	//创建滑动条
	createTrackbar("亮度值百分比", "滑动条改变图像亮度", &value, 600, callBack, 0);

	waitKey(0);
	return 0;
}

static void callBack(int, void*)
{
	float a = value / 100.0;
	img2 = img1 * a;
	imshow("滑动条改变图像亮度", img2);
}

2.鼠标响应

OpenCV提供了鼠标响应相关函数setMouseCallback:

void setMouseCallback(
    const String& winname, // 图像所在窗口名
    MouseCallback onMouse, // 鼠标响应回调函数
    void* userdata = 0     // 传递给回调函数参数
);

鼠标响应的回调函数:

typedef void (*MouseCallback)(
    int event, 
    int x, int y,   // 鼠标指针在图像坐标戏中的坐标 
    int flags, 
    void* userdata
);

event鼠标响应事件:EVENT_RBUTTONDOWN表示鼠标右键按下,EVENT_MOUSEMOVE鼠标移动。

enum MouseEventTypes {
       EVENT_MOUSEMOVE      = 0, //!< indicates that the mouse pointer has moved over the window.
       EVENT_LBUTTONDOWN    = 1, //!< indicates that the left mouse button is pressed.
       EVENT_RBUTTONDOWN    = 2, //!< indicates that the right mouse button is pressed.
       EVENT_MBUTTONDOWN    = 3, //!< indicates that the middle mouse button is pressed.
       EVENT_LBUTTONUP      = 4, //!< indicates that left mouse button is released.
       EVENT_RBUTTONUP      = 5, //!< indicates that right mouse button is released.
       EVENT_MBUTTONUP      = 6, //!< indicates that middle mouse button is released.
       EVENT_LBUTTONDBLCLK  = 7, //!< indicates that left mouse button is double clicked.
       EVENT_RBUTTONDBLCLK  = 8, //!< indicates that right mouse button is double clicked.
       EVENT_MBUTTONDBLCLK  = 9, //!< indicates that middle mouse button is double clicked.
       EVENT_MOUSEWHEEL     = 10,//!< positive and negative values mean forward and backward scrolling, respectively.
       EVENT_MOUSEHWHEEL    = 11 //!< positive and negative values mean right and left scrolling, respectively.
};

flags鼠标响应标志:EVENT_FLAG_LBUTTON表示按住鼠标左键拖拽

enum MouseEventFlags {
       EVENT_FLAG_LBUTTON   = 1, //!< indicates that the left mouse button is down.
       EVENT_FLAG_RBUTTON   = 2, //!< indicates that the right mouse button is down.
       EVENT_FLAG_MBUTTON   = 4, //!< indicates that the middle mouse button is down.
       EVENT_FLAG_CTRLKEY   = 8, //!< indicates that CTRL Key is pressed.
       EVENT_FLAG_SHIFTKEY  = 16,//!< indicates that SHIFT Key is pressed.
       EVENT_FLAG_ALTKEY    = 32 //!< indicates that ALT Key is pressed.
};

鼠标响应就是当鼠标位于对应图像窗口内时,时刻监测鼠标状态,当鼠标状态发生改变时,调用回调函数,并根据回调函数中的判断逻辑选择执行相应的操作。

下面的例子中:如果鼠标右键被按下,就会提示“点击鼠标左键才可以绘制轨迹”,如果单机鼠标左键,就会输出当前鼠标坐标,并将该坐标定义为某段轨迹的起始位置。之后按住左键移动鼠标,会绘制鼠标的移动轨迹。

一种绘制轨迹的方法时每次调用回调函数获得鼠标位置时更改周围的图像像素值,这种方法比较直观但是回调函数有一定执行时间,因此当鼠标移动较快时绘制的图像轨迹会出现断点。第二种方法是在前一时刻和当前时刻鼠标位置绘制直线。文章来源地址https://www.toymoban.com/news/detail-726574.html

#include <opencv2\opencv.hpp>
#include <opencv2/core/utils/logger.hpp> // debug no log
#include <iostream>
using namespace cv;
using namespace std;

Mat img, imgPoint; //全局的图像
Point prePoint; //前一时刻鼠标的坐标,用于绘制直线
void mouse(int event, int x, int y, int flags, void*);

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	img = imread("lena.png");
	if (!img.data)
	{
		cout << "请确认输入图像名称是否正确! " << endl;
		return -1;
	}
	img.copyTo(imgPoint);
	imshow("图像窗口 1", img);
	imshow("图像窗口 2", imgPoint);
	setMouseCallback("图像窗口 1", mouse, 0);

	waitKey(0);
	return 0;
}

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)) //鼠标按住左键移动第 3 章 图像基本操作
	{
		//通过改变图像像素显示鼠标移动轨迹
		imgPoint.at<Vec3b>(y, x) = Vec3b(0, 0, 255);
		imgPoint.at<Vec3b>(y, x - 1) = Vec3b(0, 0, 255);
		imgPoint.at<Vec3b>(y, x + 1) = Vec3b(0, 0, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(0, 0, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(0, 0, 255);
		imshow("图像窗口 2", imgPoint);

		//通过绘制直线显示鼠标移动轨迹
		Point pt(x, y);
		line(img, prePoint, pt, Scalar(0, 0, 255), 2, 5, 0);
		prePoint = pt;
		imshow("图像窗口 1", img);
	}
}

到了这里,关于OpenCV9-窗口交互操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能算法工程师面试题——之OpenCV必背汇总(四)

    在OpenCV中,图像融合通常指的是将两个或更多图像以某种方式组合在一起,以创建一个新的图像。这个过程可以用于多种目的,比如艺术效果、图像修复或信息增强。实现图像融合的一种常见方法是通过加权求和,也就是每个像素位置上将不同图像的像素值按照一定的权重相

    2024年02月21日
    浏览(40)
  • 可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

    OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩

    2024年02月01日
    浏览(35)
  • C++OpenCV(3):基础交互(视频与鼠标操作)

    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 openCV中使用鼠标的交互的函数是: setMouseCallback 可以使得 激活 对 winname 为标题的窗口进行 onMouse 回调函数执行的鼠标交互操作,并且可以传递用户自定义变量给 userdata 关于MouseCallBack回调

    2024年02月16日
    浏览(27)
  • 【Python】【OpenCV】视频帧和摄像头帧操作 and 窗口显示

    一、读取写入视频文件   二、捕获摄像头帧 和视频的读取写入没有什么差异,都是需要先创建一个VideoCapture Object来操作,下述是细微差别: 3   Line:VideoCapture(0),其中 0 代表设备,还可以1,2,3 分别代表不同的摄像头(如果存在),也可以输入网络摄像头,直接替换成

    2024年02月05日
    浏览(45)
  • 人工智能智能语音交互:让语音交互更智能

    作者:禅与计算机程序设计艺术 随着移动互联网、物联网、无人机、机器人技术等新型技术的出现,以及更多对话应用的出现,智能语音交互在当今社会越来越受到重视。最近几年,深度学习技术逐渐普及,为基于语音的智能系统的开发提供了巨大的助力,并取得了不错的成

    2024年02月10日
    浏览(40)
  • 人工智能与人类互动:如何设计一个好的人工智能交互界面?

    作者:禅与计算机程序设计艺术 引言 人工智能(AI)正在改变我们的生活和各行各业。随着 AI 技术的不断发展,越来越多的人开始关注人工智能与人类互动的设计问题。一个好的人工智能交互界面对于用户体验、应用效果以及 AI 的利用率都具有重要意义。在这篇文章中,我

    2024年02月09日
    浏览(54)
  • 人工智能+智能交互:构建智能出行新生态

    作者:禅与计算机程序设计艺术 随着人们生活节奏越来越快、交通便利度越来越高、人口密度越来越大,目前市面上有关智能交通领域的产品层出不穷,从大众出行到共享单车等,都在朝着更加智能化、个性化的方向演进。如今,智能出行已经成为人们生活的一部分,并逐渐

    2024年02月08日
    浏览(33)
  • ChatGPT:人工智能交互的未来之光

    一、ChatGPT:开启自然语言交流新纪元 ChatGPT 是基于 GPT(生成式预训练)技术的最新版本,它采用深度学习模型,通过在大规模文本数据上的预训练来理解自然语言,并生成具有连贯性和合理性的回复。ChatGPT 是一种通用的人工智能模型,能够在各种领域展现出卓越的表现,如

    2024年02月16日
    浏览(35)
  • “文心一言“:探索人工智能交互新境界

    作为一款新型创作工具,文心一言可以说是顺应了时代发展而迅速发展起来的一种创作方式。它的推出,不仅为写作爱好者提供了一种更加便捷、快捷的创作方式,也为传统的写作方式注入了新的活力。对于文心一言这样的新型创作工具,我认为我们应该进行积极的探讨和思

    2024年02月16日
    浏览(36)
  • 【Java】人工智能交互智慧导诊系统源码

    随着人工智能技术的快速发展,语音识别与自然语言理解技术的成熟应用,基于人工智能的智慧导诊导医逐渐出现在患者的生活视角中,智能导诊系统应用到医院就医场景中,为患者提供导诊、信息查询等服务,符合智慧医院建设的需求,增加患者服务渠道,改善患者就医体

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包