文章目录
- 一、图像读取显示
- 1.图像读取、显示、保存
- (1)读取imread()
- (2)是否读取成功
- ①!image.data
- ②image.empty()
- (3)显示imshow()
- (4)保存imwrite()
- 2.图像线性混合
- (1)addWeighted()
- 二、窗口
- 1.创建窗口
- 2.销毁窗口
- 3.程序等待
- 4.滑动条
- 5.鼠标
一、图像读取显示
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> ¶ms=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())
参数内部关系
整体线性混合
#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:用户可以自己调整
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,就永远不会退出