需求分析
简而言之,使用OpenCV
的addWeighted
函数,对多张图像,进行两两合并融合。
原图像
【注】图像来自于互联网,侵删。
代码实现
/*
该程序是测试,测试多张图像进行循环处理
测试成功
*/
#include <opencv2/opencv.hpp>
#include <imgproc/types_c.h>
#include <core/base.hpp>
using namespace std;
using namespace cv;
int main(){
/*
// 定义存储图像类型的容器
std::vector<cv::Mat> roiVec;
cv::Mat img1 = cv::imread("./modelLearn_1/0.jpg");
cv::Mat img2 = cv::imread("./modelLearn_1/8.jpg");
cv::Mat img3 = cv::imread("./modelLearn_1/2.jpg");
cv::Mat img4 = cv::imread("./modelLearn_1/4.jpg");
cv::Size dsize = cv::Size(280, 200);
cv::resize(img1, img1, dsize);
cv::resize(img2, img2, dsize);
cv::resize(img3, img3, dsize);
cv::resize(img4, img4, dsize);
roiVec.push_back(img1);
roiVec.push_back(img2);
roiVec.push_back(img3);
roiVec.push_back(img4);
*/
// 定义存储图像类型的容器
std::vector<cv::Mat> roiVec;
// 【知识点1】 glob 循环遍历文件夹中的图像
std::vector<cv::String> vecFileList;
cv::glob(cv::String("./modelLearn/tmp/*.jpg"), vecFileList, true); // 目的是将该路径路径下的所有文件名存入vecFileList
// 遍历图像,将图像保存至图像容器 roiVec 中
for (int p = 0; p < vecFileList.size(); p++) {
cv::Mat imgSource = cv::imread(vecFileList[p].c_str(), cv::ImreadModes::IMREAD_UNCHANGED);
// resize 图像
cv::Size dsize = cv::Size(280, 200);
cv::resize(imgSource, imgSource, dsize);
roiVec.push_back(imgSource);
}
// 【知识点2】 使用迭代器 iterator 读取容器 roiVec 中的图像
cv::Mat myMax;
int j = 0;
for (vector<cv::Mat>::iterator iter = roiVec.begin(); iter != roiVec.end(); ++iter) {
cout << "j的值为:" << j << endl;
cout << "roiVec.size:" << roiVec.size() << endl;
if (j == 0) { // (j=0)是错误表达,(j==0)是正确表达
cv::addWeighted(roiVec[j], 0.5, roiVec[j + 1], 0.5, 0.0, myMax);
}
//else if (j != 0) {
else {
cv::addWeighted(myMax, 0.5, roiVec[j + 1], 0.5, 0.0, myMax);
}
if (j == roiVec.size() - 2) {
break;
}
j++;
}
cv::imwrite("./matchTemplateImg/result.png", myMax);
return 0;
}
最终效果
知识点讲解
知识点1
使用 glob
循环遍历文件夹中的图像;
知识点2
使用迭代器 iterator
读取容器中的图像。