C++ OpenCV如何生成蒙太奇图像
这篇文章主要介绍“C++ OpenCV如何生成蒙太奇图像”,在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇图像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ OpenCV如何生成蒙太奇图像”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、输入模板图像
原图如图所示。我们将对此图生成蒙太奇图像。
Mat class="lazy" data-src = imread("Taylor.jpg"); if (class="lazy" data-src.empty()) { cout << "No image!" << endl; system("pause"); return 0; }
resize(class="lazy" data-src, class="lazy" data-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<String> &imagePathList){glob(folder, imagePathList);return 0;}
我们定义getImagePathList函数获取文件夹下所有图像的路径。
vector<Mat>images;string filename = "images/";cout << "loading..." << endl;vector<String> 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 = class="lazy" data-src.rows;int cols = class="lazy" data-src.cols;//height:表示生成的蒙太奇图像需要多少张素材图像填充rows//width:表示生成的蒙太奇图像需要多少张素材图像填充colsint height = rows / step_y, width = cols / step_x;Mat temp;Mat dst = Mat(class="lazy" data-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<Vec3b>(i, j)[0] = 0.312*dst.at<Vec3b>(i, j)[0] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = 0.312*dst.at<Vec3b>(i, j)[1] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[1];dst.at<Vec3b>(i, j)[2] = 0.312*dst.at<Vec3b>(i, j)[2] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[2];}}imshow("蒙太奇图像", dst);
我们通过遍历模板图像所有像素,并改变它们的权值,就可以得到蒙太奇图像啦。
这就是我们生成的蒙太奇图像
五、源码
#include <iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;//素材图像尺寸const int step_x = 20;const int step_y = 20;//获取文件夹下所有图像路径int getImagePathList(string folder, vector<String> &imagePathList){glob(folder, imagePathList);return 0;}int main(){Mat class="lazy" data-src = imread("Taylor.jpg");if (class="lazy" data-src.empty()){cout << "No image!" << endl;system("pause");return 0;}resize(class="lazy" data-src, class="lazy" data-src, Size(step_x*30, step_y*30), 1, 1, INTER_CUBIC);vector<Mat>images;string filename = "images/";cout << "loading..." << endl;vector<String> 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 = class="lazy" data-src.rows;int cols = class="lazy" data-src.cols;//height:表示生成的蒙太奇图像需要多少张素材图像填充rows//width:表示生成的蒙太奇图像需要多少张素材图像填充colsint height = rows / step_y, width = cols / step_x;Mat temp;Mat dst = Mat(class="lazy" data-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<Vec3b>(i, j)[0] = 0.312*dst.at<Vec3b>(i, j)[0] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = 0.312*dst.at<Vec3b>(i, j)[1] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[1];dst.at<Vec3b>(i, j)[2] = 0.312*dst.at<Vec3b>(i, j)[2] + 0.698*class="lazy" data-src.at<Vec3b>(i, j)[2];}}imshow("蒙太奇图像", dst);waitKey(0);system("pause");return 0;}
到此,关于“C++ OpenCV如何生成蒙太奇图像”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341