文章目录

  • 一、图像读取显示
  • 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())

参数内部关系

Android opencv禁用预览 opencv显示到指定窗口_Image

整体线性混合

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

Android opencv禁用预览 opencv显示到指定窗口_Image_02

局部线性混合

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

Android opencv禁用预览 opencv显示到指定窗口_Android opencv禁用预览_03

二、窗口

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,就永远不会退出