快速上手Opencv:HighGUI图形用户界面

这篇具有很好参考价值的文章主要介绍了快速上手Opencv:HighGUI图形用户界面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.图像的载入、显示和输出到文件

1.1 图像的载入:imread()函数

Mat imread(const string &filename,int flags=1)

  • 第一个参数:图片路径
  • 第二个参数:载入标识,指定一个加载图像的颜色类型。可以看到它自带的默认值为1

1.2 图像的显示:imshow()函数

void imshow(const string& winname InputArray mat)

  • 第一个参数:填需要显示的窗口标识名称
  • 第二个参数:填需要显示的图像

1.3 创建窗口:namedWindow()函数

void namedWindow(const string &winname, int flags=WINDOW_AUTOSIZE)

  • 第一个参数:窗口名称
  • 第二个参数:窗口的标识,可以设置以下几个值

    WINDOW_NORMAL:用户可以改变窗口大小
    WINDOW_AUTOSIZE:窗口大小会自动调整使用图片的大小,用户不能手动改变窗口的大小
    WINDOW_OPENGL:窗口创建的时候会支持OPENGL

1.4 输入图像到文件:imwrite()函数

bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )

  • 第一个参数: 填写要写入的文件名,带上后缀,如123.jpg
  • 第二个参数:一般填一个Mat类型的图像数据
  • 第三个参数:表示为特定格式保存的参数编码

1.5综合案例代码

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main() {
	//---------------------1.图像的载入和显示---------------------
	Mat girl = imread("../../image/girl.jpg"); //载入图像到Mat
	namedWindow("【1】动漫图", WINDOW_NORMAL); //创建一个名为 [1]动漫图 的窗口
	imshow("【1】动漫图", girl); //显示名为“【1】动漫图”的窗口

	//-----------------------2.初级图像混合------------------------
	Mat dota= imread("../../image/dota.jpg");
	Mat logo = imread("../../image/logo.jpg");

	//载入后显示
	namedWindow("【2】dota",WINDOW_NORMAL);
	imshow("【2】dota", dota);
	namedWindow("【3】logo", WINDOW_NORMAL);
	imshow("【3】logo", logo);
	
	//定义一个Mat类型,用于存放图像的ROI
	Mat imageROI;
	//方法一
	imageROI = dota(Rect(800, 350, logo.cols, logo.rows));
	//方法二
	dota(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));
	
	//将image2加到image1上
	addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
	
	//显示结果
	namedWindow("【4】dota+logo", WINDOW_NORMAL);
	imshow("【4】dota+logo", dota);

//-------------------------------3.图像的输出----------------------------
	//将一个Mat图像输出到图像文件
	imwrite("由imrite生成的图片.jpg", dota);
	waitKey(0);
	
	return 0;
}

快速上手Opencv:HighGUI图形用户界面

2. 滑动条的创建和使用

2.1 创建滑动条:createTrackbar()函数

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

  • 第一个参数:轨迹条的名字
  • 第二个参数:窗口的名字
  • 第三个参数:一个指向整形的指针,表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
  • 第四个参数:表示滑块可以达到的最大值。滑块最小位置的值始终为0;

2.2 滑动条案例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;

#define WINDOW_NAME "【线性混合示例】" //为窗口标题定义的宏


//---------------------全局变量声明部分---------------------
const int g_nMaxAlphaValue = 100; //Alpha的最大值
int g_nAlphaValueSlider; //滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;


//--------------------on_Trackbar()函数---------------------
//相应滑动条的回调函数
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);

}

int main() {
	//加载图像
	g_srcImage1 = imread("../../image/1.tif");
	g_srcImage2 = imread("../../image/2.tif");
	if (!g_srcImage1.data) {
		cout << "读取第一幅图片失败" << endl;
		return -1;
	}
	if (!g_srcImage2.data) {
		cout << "读取第二幅图片失败" << endl;
		return -1;
	}

	//设置滑动条初值为70
	g_nAlphaValueSlider = 70;

	//创建窗体
	namedWindow(WINDOW_NAME, 1);

	//在创建的窗体中创建一个滑动条控件
	char TrackbarName[50];
	sprintf_s(TrackbarName, "透明值%d", g_nMaxAlphaValue);
	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider,
		g_nMaxAlphaValue, on_Trackbar);

	//结果在回调函数中显示
	on_Trackbar(g_nAlphaValueSlider, 0);
	
	waitKey(0);
	return 0;
}

快速上手Opencv:HighGUI图形用户界面

2.3 获取当前轨迹条的位置:getTrackbarPos()函数

该函数是配合createTrackbar使用的函数,它用于获取当前轨迹条的位置。
int getTrackbarpos(const string& trackbarname,const string& winname);

  • 第一个参数:表示轨迹条的名字
  • 第二个参数:表示轨迹条的父窗口的名称

3.鼠标操作

OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的。
void setMousecCallback(const string &winname,MouseCallback onMouse,void* userdata=0)

  • 第一个参数:窗口的名称
  • 第二个参数:指定窗口里每次鼠标时间发生的时候,被调用的函数指针。

3.1 鼠标操作案例

#include<opencv2/opencv.hpp>
using namespace cv;

#define WINDOW_NAME "【程序窗口】"

//----------------------------全局函数声明-----------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(Mat& img, Rect box);
void ShowHelpText();

//-------------------------全局变量声明部分-----------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);

int main() {
	g_rectangle = Rect(-1, -1, 0, 0);
	Mat srcImage(600, 800, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rectangle = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//设置鼠标操作回调函数
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)& srcImage);

	//循环,当进行绘制的标识符为真时,进行绘制
	while (1) {
		srcImage.copyTo(tempImage); //复制原图到临时变量
		if (g_bDrawingBox)
			DrawRectangle(tempImage, g_rectangle);
		imshow(WINDOW_NAME, tempImage);
		if (waitKey(10) == 27) 
			break; //按下ESC程序退出
	}
	return 0;
}

void on_MouseHandle(int event, int x, int y, int flag, void* param) {
	Mat& image = *(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.x += g_rectangle.height;
				g_rectangle.height *= -1;
			}

			//调用绘制函数
			DrawRectangle(image, g_rectangle);
		}
			break;
	}
}


//------------------------DrawRectangle()函数------------------------
void DrawRectangle(Mat& img, Rect box) {
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
		g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//设置随机颜色
}

快速上手Opencv:HighGUI图形用户界面文章来源地址https://www.toymoban.com/news/detail-481321.html

到了这里,关于快速上手Opencv:HighGUI图形用户界面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python图形用户界面

    目录 1.图形用户界面概述 1.1tkinter 2.tkinter概述 2.1tkinter模块 2.2图形用户界面的构成  2.3框架和GUI应用程序类 2.4tkinter主窗口 3几何布局管理器 3.1pack几何布局管理器 3.2grid几何布局管理器 3.3place几何布局管理器 4.事件处理 4.1事件类型 4.2事件绑定 4.3事件处理函数 5.常用组件   

    2024年02月09日
    浏览(32)
  • 设计图形用户界面的原则

    1) 一般性原则:界面要具有一致性、常用操作要有快捷方式、 提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可 逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息 显示方式与数据输入方式的协调一致 2) 颜色的使用:颜色是一种有效的强化

    2024年02月08日
    浏览(53)
  • Java | GUI 图形用户界面

            GUI 全称 Graphical User Interface 图形用户界面 ,指采用图形方式显示的计算机操作用户界面。 软件以图形界面形式运行时,用户可借助于菜单、按钮、标签等组件和通过鼠标、键盘等的操作共同完成对软件的应用。         当程序运行后,出现的图形窗口,称为

    2024年02月08日
    浏览(34)
  • Java——GUI(图形用户界面)

    1、掌握布局管理器、AWT事件处理机制以及常用事件 2、熟悉Swing组件的使用 3、了解GUI开发的相关原理和技巧 GUI全称是GraphicalUser Interface,即图形用户界面。顾名思义,就是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其他各种图形界面元素。目前,

    2024年02月09日
    浏览(29)
  • Qt用户图形界面设计应用(闹钟)

    什么是Qt Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司于 1995 年底出品,并于 2008年6月17日被NOKIA公司收购,以增强NOKIA公司在跨平 台软件研发方面的实力,更名为Qt Software。 Qt的优点 基本上, Qt 同 X Window 上的 Motif, Openwin, GTK 等图形界 面库 和 Windows 平台上的

    2024年02月08日
    浏览(49)
  • MATLAB 之 可视化图形用户界面设计

    MATLAB 提供了图形用户界面开发环境(Graphical User Interface Development Environment,GUIDE),在这种开发环境下,用户界面设计变得方便、直观,实现了 “所见即所得” 的可视化设计。 1.1 图形用户界面设计模板 在 MATLAB 命令行窗口输入 guide 命令,或在 MATLAB 主窗口中选择 “主页”

    2024年02月11日
    浏览(35)
  • 如何使用Java实现图形用户界面(GUI)?

    随着计算机技术的不断发展,图形用户界面(GUI)成为现代软件开发的一个重要方面。通过使用GUI,开发人员可以创建具有可视化界面的应用程序,以提供更好的用户体验。在本文中,我们将介绍如何使用Java实现GUI。 Java提供了多个GUI库,包括Swing、JavaFX和AWT。其中,Swing和

    2024年02月04日
    浏览(31)
  • Python 图形用户界面(GUI)框架有哪些

    Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。轻量级的跨平台图形用户界面(GUI)开发工具。 由于 Tkinter 是内置到 python 的安装包中 、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是

    2024年02月08日
    浏览(46)
  • 如何设计和构建一个PyQt图形用户界面(GUI)

    欢迎来到PyQt的世界!设计和构建一个图形用户界面(GUI)可以是一项令人兴奋且有趣的任务。 首先,你需要确保已经安装了PyQt。如果你还没有安装,可以通过以下命令在你的Python环境中安装: 现在,让我们开始设计你的第一个PyQt GUI! 第一步:创建窗口 想象一下,如果你

    2024年02月12日
    浏览(33)
  • 探索PySimpleGUI:一款简洁易用的图形用户界面库

    目录 PySimpleGUI 安装使用 代码框架 常用控件 Text Input Button 布局方法 事件循环 示例代码 调试窗口 主题 theme Listbox控件 简单实例 小结 PySimpleGUI是一个基于Tkinter、WxPython、Qt等底层库构建的图形界面框架,其设计目标是使Python GUI编程变得更加简单直观,大大降低了入门门槛。无

    2024年01月18日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包