在学习多通道图像混合的时候,发现将图片分成多通道(split),想把其中一个通道跟别的图片相加的时候,别的图片也需要是单通道的图像,如灰度图、或者是BlueChannel等等。代码如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <cstring>
using namespace cv;
using namespace std;
string picroad = "E:\\VisualStudioProjects\\PICS";
//---------------------------------【MultiChannelBlending()】-------------------------------------
// 函数名:MultiChannelBlending()
//
//--------------------------------------------------------------------------------------------
bool MultiChannelBlending()
{
vector<Mat> channels;
vector<Mat> channels2;
Mat imageBlueChannel;
Mat logoImageBlueChannel;
//【1】读取图像
string picroad_srcimage4 = picroad + "\\dota_pa.jpg";
string picroad_logoimage = picroad + "\\dota_logo.jpg";
Mat srcImage4 = imread(picroad_srcimage4);
Mat logoImage = imread(picroad_logoimage);//注意!!!这里必须用灰度图(0)
//两幅相同的类型的图像才能混合。源图像已经分离成B\G\R单通道图像,所以加载时需要设置为灰度图。
if (!srcImage4.data) { printf("你妹,读取srcImage4错误~! \n"); return false; }
if (!logoImage.data) { printf("你妹,读取logoImage错误~! \n"); return false; }
split(srcImage4,channels);
imageBlueChannel = channels.at(0);
split(logoImage, channels2);
logoImageBlueChannel = channels2.at(0);
addWeighted(imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImageBlueChannel, 0.5, 0, imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)));
merge(channels,srcImage4);
//【4】显示结果
namedWindow("<5>通过<4>改编的多通道混合 by zxjor");
imshow("<5>通过<4>改编的多通道混合 by zxjor", srcImage4);
return true;
}
void main(){
system("color 4E");
if (MultiChannelBlending())
{
cout << endl << "OK, get the picture you want";
}
waitKey();
}