2022-4-26:OpenCV入门(二)认识HighGUI图形用户界面

1.图像载入

Mat imread(const strings& filename, intflags=1);
//第一个为读取图像的路径;第二个为图像的颜色空间类型:1为三通道,0为单通道,

2.图像显示

void imshow(const string& winname,IputArray mat)
//第一个为需要显示的窗口名称,第二个为需要显示的图像。

3.显示窗口

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE);
//第一个参数为窗口名称;第二个参数为窗口的标识,WINDOW_AUTOSIZE使得窗口大小自适应调整。

4.保存图像

bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>());
//第一个参数为写入的文件夹路径,带上后缀“.jpg”;第二个参数为需要写入的图像;第三个参数为特定格式保存的参数编码。

5.滑动条的创建使用

int createTrackbar(conststring& trackbarname,conststring& winname,
int* value,int count,TrackbarCallback onChange=0void* userdata=0);
//第一个参数为轨迹条的名字;第二个参数为窗口的名字,即对应的nameWindow();第三个参数为滑块的位置;
//第四个参数为滑块可以达到的最大位置的值;第五个参数为回调函数;第六个参数为用户传给回调函数的数据。

应用示例

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
//代码来源于OpenCV3编程入门
#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);
	//g_dstImage=g_srcImage1*g_dAlphaValue+g_srcImage2*g_dBetaValue+0.0;
	//显示效果图
	imshow(WINDOW_NAME, g_dstImage);
}

//--------------------------------------【main( )函数】-----------------------------------------
//		描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
	//加载图像 (两图像的尺寸需相同)
	g_srcImage1 = imread("1.jpg");
	g_srcImage2 = imread("2.jpg");
	if (!g_srcImage1.data) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
	if (!g_srcImage2.data) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }
	//设置滑动条初值为70
	g_nAlphaValueSlider = 70;
	//创建窗体
	namedWindow(WINDOW_NAME, 1);
	//在创建的窗体中创建一个滑动条控件
	char TrackbarName[50];
	sprintf_s(TrackbarName,50, "透明值 %d", g_nMaxAlphaValue);
	createTrackbar(TrackbarName, WINDOW_NAME,&g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);	
	//结果在回调函数中显示
	on_Trackbar(g_nAlphaValueSlider, 0);
	//按任意键退出
	waitKey(0);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
获取当前轨迹条的位置

int getTrackbarPos(conststring& trackbarname, conststring& winname);
//第一个参数为轨迹条的名字;第二个名字为轨迹条父窗口名字。

6.鼠标操作

void setMouseCallback(conststring& winname,MouseCallback onMouse,void* userdata=0)
//第一个参数为窗口的名字;第二个参数为被调用的函数指针;第三个参数为传递到回调函数的参数,默认值0。

应用示例

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


Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);

//-----------------------------------【main( )函数】--------------------------------------------
int main(int argc, char** argv)
{

	//【1】准备参数
	g_rectangle = Rect(-1 ,-1, 0, 0);
	Mat srcImage(600, 800, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);//复制图像
	srcImage = Scalar::all(0);//像素值全部初始化为0

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

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

//--------------------------------【on_MouseHandle( )函数】-----------------------------
//		描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, 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.y += 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)));
	//随机颜色,tl、br为左上点和右下点坐标位置
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误提示 "fatal error: opencv/cv.h: 没有那个文件或目录" 表明在编译过程中找不到 "opencv/cv.h" 这个头文件。根据引用的内容,可以尝试将文件中的 "#include <opencv/cv.h>" 替换为 "#include <opencv2/opencv.hpp>"。另外,引用中提到,如果你要使用自己指定路径的opencv-4.2.0,可以在CMakeList.txt文件中添加以下指令:set(CMAKE_PREFIX_PATH "/home/wangyy/opencv4")。这样编译器就能找到正确的opencv路径并包含相应的头文件。希望这些信息对解决你的问题有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [fatal error: opencv/cv.h: 没有那个文件或目录 错误;fatal error: opencv2/contrib/contrib.hpp: 没有...](https://blog.csdn.net/pvmsmfchcs/article/details/128658681)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ORBSLAM3和配套file:///home/nsvi/ORB_SLAM3-master.zippangolin](https://download.csdn.net/download/weixin_41623823/85346807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值