C++ OpenCV如何生成蒙太奇图像
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"C++ OpenCV如何生成蒙太奇图像",在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇图像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2026年11月02日C++ OpenCV如何生成蒙太奇图像
这篇文章主要介绍"C++ OpenCV如何生成蒙太奇图像",在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇图像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++ OpenCV如何生成蒙太奇图像"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、输入模板图像
原图如图所示。我们将对此图生成蒙太奇图像。
Mat src = imread("Taylor.jpg"); if (src.empty()) { cout << "No image!" << endl; system("pause"); return 0; }resize(src, src, Size(step_x*30, step_y*30), 1, 1, INTER_CUBIC);
这里的step_x,step_y表示素材图像尺寸。我们要把模板图像resize成 Size(step_x 30, step_y*30)尺寸,将模板图像分割成30x30个block,即使用30x30张素材图像来生成我们的蒙太奇图像。
二、读取素材图像
所有素材图像。
//获取文件夹下所有图像路径int getImagePathList(string folder, vector&imagePathList){ glob(folder, imagePathList); return 0;}
我们定义getImagePathList函数获取文件夹下所有图像的路径。
vectorimages; string filename = "images/"; cout << "loading..." << endl; vector imagePathList; getImagePathList(filename, imagePathList); for (int i = 0; i < imagePathList.size(); i++) { Mat img = cv::imread(imagePathList[i]); resize(img, img, Size(step_x, step_y), 1, 1, INTER_AREA); images.push_back(img); } cout << "done!" << endl;
我们将读取进来的所有素材图像都resize成 Size(step_x, step_y)大小,并把它们都push_back到images容器内,以便后续使用。
三、生成蒙太奇模板
int rows = src.rows; int cols = src.cols; //height:表示生成的蒙太奇图像需要多少张素材图像填充rows //width:表示生成的蒙太奇图像需要多少张素材图像填充cols int height = rows / step_y, width = cols / step_x; Mat temp; Mat dst = Mat(src.size(), CV_8UC3, Scalar(255, 255, 255)); for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { //index表示当前素材图像的索引 int index = i * width + j; //将当前素材图像拷贝到temp零时变量 images[index].copyTo(temp); //将temp图像赋值给需要生成的蒙太奇图像对应区域 temp = dst(Rect(j * step_x, i * step_y, step_x, step_y)); } } imshow("dst", dst);通过两个for循环就可以遍历到每个蒙版区域。这个类似于遍历图像的所有像素,只不过我们把步长加大了而已。整个代码的核心就是以下这两句。
//将当前素材图像拷贝到temp零时变量 images[index].copyTo(temp); //将temp图像赋值给需要生成的蒙太奇图像对应区域 temp = dst(Rect(j * step_x, i * step_y, step_x, step_y));
将所有的素材图像copy到指定区域就可以生成蒙版图像啦。接下来我们就得对这个蒙版图像做像素处理了。
四、生成蒙太奇图像
for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { //像素RGB值修改 dst.at(i, j)[0] = 0.312*dst.at(i, j)[0] + 0.698*src.at(i, j)[0]; dst.at(i, j)[1] = 0.312*dst.at(i, j)[1] + 0.698*src.at(i, j)[1]; dst.at(i, j)[2] = 0.312*dst.at(i, j)[2] + 0.698*src.at(i, j)[2]; } } imshow("蒙太奇图像", dst); 我们通过遍历模板图像所有像素,并改变它们的权值,就可以得到蒙太奇图像啦。
这就是我们生成的蒙太奇图像
五、源码
#include#include using namespace std;using namespace cv;//素材图像尺寸const int step_x = 20;const int step_y = 20;//获取文件夹下所有图像路径int getImagePathList(string folder, vector &imagePathList){ glob(folder, imagePathList); return 0;}int main(){ Mat src = imread("Taylor.jpg"); if (src.empty()) { cout << "No image!" << endl; system("pause"); return 0; } resize(src, src, Size(step_x*30, step_y*30), 1, 1, INTER_CUBIC); vector images; string filename = "images/"; cout << "loading..." << endl; vector imagePathList; getImagePathList(filename, imagePathList); for (int i = 0; i < imagePathList.size(); i++) { Mat img = cv::imread(imagePathList[i]); resize(img, img, Size(step_x, step_y), 1, 1, INTER_AREA); images.push_back(img); } cout << "done!" << endl; int rows = src.rows; int cols = src.cols; //height:表示生成的蒙太奇图像需要多少张素材图像填充rows //width:表示生成的蒙太奇图像需要多少张素材图像填充cols int height = rows / step_y, width = cols / step_x; Mat temp; Mat dst = Mat(src.size(), CV_8UC3, Scalar(255, 255, 255)); for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { //index表示当前素材图像的索引 int index = i * width + j; //将当前素材图像拷贝到temp零时变量 images[index].copyTo(temp); //将temp图像赋值给需要生成的蒙太奇图像对应区域 temp = dst(Rect(j * step_x, i * step_y, step_x, step_y)); } } imshow("dst", dst); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { //像素RGB值修改 dst.at (i, j)[0] = 0.312*dst.at (i, j)[0] + 0.698*src.at (i, j)[0]; dst.at (i, j)[1] = 0.312*dst.at (i, j)[1] + 0.698*src.at (i, j)[1]; dst.at (i, j)[2] = 0.312*dst.at (i, j)[2] + 0.698*src.at (i, j)[2]; } } imshow("蒙太奇图像", dst); waitKey(0); system("pause"); return 0;}
到此,关于"C++ OpenCV如何生成蒙太奇图像"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
图像
蒙太奇
生成
素材
像素
区域
模板
C++
学习
变量
尺寸
拷贝
文件
文件夹
路径
接下来
就是
更多
版图
索引
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
互联网科技产业
互联网科技官网
科技互联网项目
苏州互联网科技贷款公司
天津摩尔互联网科技
奇士达互联网科技
融势互联网科技
互联网科技宣传片
华脉科技工业互联网产品
农村开互联网科技讲堂
隆华科技工业互联网
青岛中康互联网医疗科技有限公司
互联网科技中介
昭通互联网科技选哪家
华夏互联网科技业
晓花互联网科技有限公司网址
链环科技传统企业怎么转型互联网
产业互联网科技服务公司
利用互联网等科技手段
互联网科技公司排名
科技与互联网
互联网扶贫科技
关于新基建和互联网科技
广州互联网络科技有限公司
互联网科技视频素材
互联网科技公司做什么
海南购全球互联网科技
小米互联网科技园入驻
互联网科技企业商标注意事项