C++ OpenCV如何生成蒙太奇图像
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍"C++ OpenCV如何生成蒙太奇图像",在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇图像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
网络安全产业链官网
嘟嘟瓜互联网科技怎么样
湖南常规软件开发参考价
网关管理服务器
网络安全技术有限公司名字
微信视频消息保存在腾讯服务器吗
广州会务无纸化软件开发
vc 开发web服务器
数据共享服务器英文
数据库第三方平台排名
网络安全要看tcpip吗
数据库显示树形
达梦数据库超时
软件开发 竞标文档
好玩吧软件开发商
数据库突然cpu过高
安装App网络安全
杭州电脑软件开发计划
鸿蒙系统软件开发问题
全国的软件开发企业有多少家
软件开发为什么需要算法
福州海纳百川网络技术
传媒公司可以做软件开发的活吗
德州苹果软件开发系统
电脑改成服务器
数据库应用与技术 教学
天津erp软件开发
秒级搭建mysql数据库服务
数据库连接函数的函数名称是什么
戴尔服务器拆装硬盘