#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
//图片重叠
int main(int argc, char** argv)
{
Mat src, src1, src2, dst2;
src1 = imread("F:/TestImage/emoji1.jpg");
src2 = imread("F:/TestImage/emoji1.jpg");
//在这因为没找到大小相同的图片,所以最后还是用一张图片来做......
if (src1.empty())
{
cout << "could not load image 1 ..." << endl;
return -1;
}
if (src2.empty())
{
cout << "could not load image 2 ..." << endl;
return -1;
}
/*int height = src2.rows;
int width = src2.cols;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int gray = src2.at<uchar>(row, col);
src2.at<uchar>(row, col) = 255 - gray;
}
}*/
Mat dst;
int height = src2.rows;
int width = src2.cols;
dst.create(src2.size(), src2.type());
height = src2.rows;
width = src2.cols;
int nc = src2.channels();
//这个地方用255-图像像素强度值,得到的图像在接下来的处理中,由于两个图片强度值相加会大于255,图片会出现加载不出来的情况
//是这样吗
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (nc == 1) {
int gray = src2.at<uchar>(row, col);
src2.at<uchar>(row, col) = 255 - gray;
}
else if (nc == 3)
{
int b = src2.at<Vec3b>(row, col)[0];
int g = src2.at<Vec3b>(row, col)[1];
int r = src2.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
//gray_src.at<uchar>(row, col) = min(r, min(b, g));
}
}
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
{
addWeighted(src1, alpha, dst, (1.0 - alpha), 20, dst2);
imshow("笑", src1);
imshow("啊", dst);
namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
imshow("blend demo", dst2);
}
else
{
printf("could not blend image,the size of image is not same...\n");
return -1;
}
/*namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);*/
waitKey(0);
return 0;
}
addWeighted()函数(copy的) :
addWeighted()函数是将两张相同大小,相同类型的图片融合的函数。
void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重
参数3:src2第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
提问:
RGB值超出255会出现什么情况?是纯白色吗?为什么会出现灰色的图片?