OpenCV之图像读取显示保存和窗口


一、图像读取显示

1.图像读取、显示、保存

(1)读取imread()

原型:

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

参数:

返回一个Mat类,所以用来读取图片

  • filename是图片所在路径
  • flags是加载图像的颜色类型:
    • 单个元素
      • flags>0:返回三通道的彩色图(默认为1)
      • flags=0:返回灰度图
      • flags<0:返回包含Alpha通道的图
    • 多个元素:
      • 2|4:表示读取无损的图像

如:

Mat image0=imread("1.jpg",2|4);	//无损
Mat image1=imread("1.jpg",0);	//灰度
Mat image2=imread("1.jpg",666);	//三通道彩色

(2)是否读取成功

①!image.data

image.data是指向数据的指针,如果没有数据的话,那么指针就是空的。

// 检测是否读取成功
if(!image.data)
{
	printf("loading error\n");
	return 0;
}
②image.empty()
bool cv::Mat::empty()

如果为空,返回true。

例如:

if (image.empty())
{
	printf("loading error\n");
	return 0;
}

(3)显示imshow()

原型:

void imshow(const String &winname, InputArray mat)

参数:

  • winname:显示出来的图像的标识名称
  • mat:要显示的图像

如:

imshow("hello",image0);

PS

它本身就可以创建窗口,所以一般不用namedWindow()就ok。(此时的图像不可自己拉伸)
但如果你有特殊要求的话,才和namedWindow()结合。
比如:你要自己的图像可以拉伸

namedWindow("Name",WINDOW_NORMAL);
imshow("Name",dstImage);
//名字要一致,这样imshow就不会创建新的窗口,而是使用nameWindow()创建的窗口

一定要加waitKey();不然不会显示出图片

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

int main()
{
	Mat tree = imread("./tree.jpg");
    // 检测是否读取成功
    if( !tree.data ){
        printf("error\n");
        return 0;
    }
    imshow("tree",tree);
    waitKey();
}

(4)保存imwrite()

原型:

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

参数:

  • filename:表示保存的图片文件名(要有后缀,后缀得是图片格式,和读入imread()不一样也行)
  • img:要保存的Mat类图像
  • params:默认vector,一般用不到自己填写

并不可以直接进行格式转化,jpg→png是失败的

Mat srcImage=imread("3.jpg");
imwrite("3-png.png",srcImage);
//3-png.png出来没用,虽然后缀是png,但其实不是。

2.图像线性混合

(1)addWeighted()

同尺寸的图片才能混合

原型

void addWeighted(
	InputArray src1, 
	double alpha, 
	InputArrary src2, 
	double beta, 
	double gamma, 
	OutputArray dst, 
	int dtype=-1
);

参数

  • src1:要混合的图像1
  • alpha:图像1的权重
  • src2:要混合的图像2
  • beta:图像2的权重
  • gamma:加到权重总和上的标量值。一般为0.0
  • dst:输出的图像
  • dtyper:输出阵列的深度。默认-1表示同输入图像的深度(即等同于src1.depth())

参数内部关系

d s t = s r c 1 [ I ] ∗ a l p h a + s r c 2 [ I ] ∗ b e t a + g a m m a dst=src1[I]*alpha+src2[I]*beta+gamma dst=src1[I]alpha+src2[I]beta+gamma

整体线性混合

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

int main()
{
	Mat backImage=imread("11.jpg");
	Mat logoImage=imread("12.jpg");
	Mat dstImage;
	addWeighted(backImage,0.5,logoImage,0.5,0.0,dstImage);
	imshow("11.jpg",backImage);
	imshow("12.jpg",logoImage);
	imshow("Effect",dstImage);
	waitKey();
	return 0;
}

在这里插入图片描述

局部线性混合

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

int main()
{
	Mat backImage=imread("12.jpg");
	Mat logoImage=imread("5.jpg");
	Mat ROI=backImage(Rect(0,0,logoImage.cols,logoImage.rows));
	addWeighted(ROI,0.5,logoImage,0.3,0.0,ROI);
	imshow("Effect",backImage);
	waitKey();
	return 0;
}

在这里插入图片描述

二、窗口

1.创建窗口

namedWindow()

原型:

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

参数:

  • winname:表示要创建出的窗口的名称
  • flags:表示窗口的设置
    • WINDOW_AUTOSIZE(默认):自动调整窗口大小适应图像,但不能手动调整
    • WINDOW_NORMAL:用户可以自己调整
      - WINDOW_OPENGL:使窗口支持OpenGL

PS:

这个窗口可以提供给imshow()使用,完成特定的窗口要求。上面已经讲过了。

2.销毁窗口

void destroyWindow(const String &winname)
或者
void destroyAllWindows()

3.程序等待

原型:

int waitKey(int delay=0)	

参数;

返回值是按下按键的码(Esc的码是27),或者返回-1(没有按键被按下)。注意它只返回一次。

  • delay:表示延迟时间,单位是毫秒
    0:表示一直等待

waitKey();	//一直等待
if(waitKey()=27) return 0;
cout<<"Just One";
//如果你按下ABCD,按完A就输出Just One了。并不是一直等待。
while(1){
	if(waitKey()==27) break;
}
//这样不按Esc,就永远不会退出

4.滑动条

OpenCV滑动条

5.鼠标

OpenCV之鼠标

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值