#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
/* 图像的载入和显示 */
Mat horo = imread("1.jpg"); //载入图像到Mat
namedWindow("【1】动漫图"); //创建一个窗口
imshow("【1】动漫图", horo); //显示窗口
/* 初级图像混合 */
//载入图片
Mat image = imread("fate.jpg");
Mat logo = imread("lingzhou.jpg");
//载入后显示
namedWindow("【2】原画图");
imshow("【2】原画图", image);
namedWindow("【3】logo图");
imshow("【3】logo图", logo);
//定义一个Mat类型,用于存放图像的ROI
Mat imageROI;
imageROI = image(Rect(1000, 400, logo.cols, logo.rows));
//imageROI = image(Range(400, 400 + logo.rows), Range(1000, 1000 + logo.cols));
//将logo加到原图上
addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
//显示结果
namedWindow("【4】原画+logo图");
imshow("【4】原画+logo图", image);
/* 将一个Mat图像输出到图像文件 */
//输出一张jpg图片到工程目录下
imwrite("由imwrite生成的图片.jpg", image);
waitKey();
return 0;
}
imread函数
Mat imread(const string& filename, intflags=1 );
第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。定义如下:
enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1, //这个标识在新版本中被废置了,忽略。
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0, //始终将图像转换成灰度
/* ?, color */
CV_LOAD_IMAGE_COLOR =1, //总是转换图像到彩色一体,3通道图
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2, //若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4
};
书上说
- flags >0返回一个3通道的彩色图像。
- flags =0返回灰度图像。
- flags <0返回包含Alpha通道的加载的图像。
但是我在实际测试时,写入不属于枚举值的大于0的值会影响图片尺寸。
addWeighted函数
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
参数 | 说明 |
---|---|
src1 | InputArray类型表示需要加权的第一个数组,常常填一个Mat |
alpha | 表示第一个数组的权重 |
src2 | 表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数 |
beta | 表示第二个数组的权重值 |
dst | 输出的数组,它和输入的两个数组拥有相同的尺寸和通道数 |
gamma | 一个加到权重总和上的标量值 |
dtype | 输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth() |
计算公式:dst(I)=src1(I)*alpha+src2(I)*beta+gamma。alpha和beta分别代表两个图像在dst图像中占得比例,实际测试会影响混合区域的透明度。