1.今天做图像融合遇到的问题,
imageROI = image(Range(350, 350+logo.rows), Range(800, 800+logo.cols));
接着出现异常中断,以下为控制台显示的错误信息:
OpenCV Error: Assertion failed (0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows) in cv::Mat::Mat
百度了一下,虽然不能精确百度到结果,但大概知道意思:想要划分的图形区域超过了图像的大小,从而导致中断,将图形区域的范围合理化后,能正常运行并显示。
2.使用Trackbar
当使用trackbar进行融合显示时,addWeighted()函数中进行显示的Mat要与imshow()的一致,否则在操作轨迹条的时候会导致不能正常显示,不能进行调节。
同时,对于addWeighted函数,其中src1和src2,还要dis都要是一样的数组。
3.图像各个通道的融合
使用split和merge函数可以实现对图像通道的分离与
split(srcImage, channels);//分离彩色通道
imageBlueChannel = channels.at(0);//蓝色通道
merge(channels, srcImage);//合并通道
根据addWeighted函数的参数设置矩形位置,使用各通道与图像进行融合,同和结束之后把通道合并,即可得到想要的结果。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
bool MultiChannelBlending();
void ShowHelpText();
int main()
{
system("color 9F");
if (MultiChannelBlending())
{
cout << endl << "\n运行成功";
}
waitKey();
destroyAllWindows();
return 0;
}
bool MultiChannelBlending()
{
Mat srcImage;
Mat logoImage;
vector<Mat> channels;
Mat imageBlueChannel;
Mat imageGreenChannel;
Mat imageRedChannel;
logoImage = imread("2.jpg", 0);
srcImage = imread("1.jpg");
if(!logoImage.data)
{
printf("error");
return false;
}
if (!srcImage.data)
{
printf("error");
return false;
}
split(srcImage, channels);//分离色彩通道
imageBlueChannel = channels.at(0);
imageGreenChannel = channels.at(1);
imageRedChannel = channels.at(2);
//蓝色通道与图片融合
addWeighted(imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)),1.0,
logoImage, 0.5, 0.0, imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)));
//绿色通道与图片融合
addWeighted(imageGreenChannel(Rect(logoImage.cols, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0.0, imageGreenChannel(Rect(logoImage.cols, 0, logoImage.cols, logoImage.rows)));
//红色通道与图片融合
addWeighted(imageRedChannel(Rect(logoImage.cols * 2, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0.0, imageRedChannel(Rect(logoImage.cols * 2, 0, logoImage.cols, logoImage.rows)));
merge(channels, srcImage);//将三个单通道重新合并成一个三通道
namedWindow("三种通道融合");
imshow("三种通道融合", srcImage);
}
结果: