本文将使用opencv c++ 生成蒙太奇图像。
原图如图所示。我们将对此图生成蒙太奇图像。
mat src = imread("taylor.jpg"); if (src.empty()) { cout << "no image!" << endl; system("pau"); 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)尺寸,将模板图像分割成30×30个block,即使用30×30张素材图像来生成我们的蒙太奇图像。
所有素材图像。
//获取文件夹下所有图像路径int getimagepathlist(string folder, vector<string> &imagepathlist){glob(folder, imagepathlist);return 0;}
我们定义getimagepathlist函数获取文件夹下所有图像的路径。
vector<mat&新郎父亲致辞gt;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 = src.rows;int cols = src.cols;//height:表示生成的蒙太奇图像需要多少张素材图像填充rows//width:表示生成的蒙太奇图像需要多少张素材图像填充colsint 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<vec3b>(i, j)[0] = 0.312*dst.at<vec3b>(i, j)[0] + 0.698*src.at<vec3b>(i, j)[0];dst.at<vec3b>(i, j)[1] = 0.312*dst.at<vec3b>(i, j)[1] + 0.698*src.at<vec3b>(i, j)[1];dst.at<vec3b>(i, j)[2] = 0.312*dst.at<vec3b>(i, j)[2] + 0.698*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 src = imread("taylor.jpg");if (src.empty()){cout << "no ima端午节的祝福语大全ge!" << endl;system("pau");return 0;}resize(src, 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 = src.rows;int cols = src.cols;//height:表示生成的蒙太奇图像需要多少张素材图像填充rows//width:表示生成的蒙太奇图像需要多少张素材图像填充colsint 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<vec3b>(i, j)[0] = 0.312*dst.at<vec3b>(i, j)[0] + 0.698*src.at<vec3b>(i, j)[0];dst.at<vec3b>(i, j)[1] = 0.312*dst.at<vec3b>(i, j)[1] + 0.698*src.at<vec3b>(i, j)[1];dst.at<vec3b>(i, j)[2] = 0.312*dst.at<vec3b>(i, j)[2] + 0.698*src.at<vec3b>(i, j)[2];}}imshow("蒙太奇图像", dst);waitkey(0);system("pau");return 0;}
本文使用opencv c++生成蒙太奇图像,关键步骤有以下几点。
1、将你需要生成的蒙太奇图像模板resize成合适大小,使其恰好能够被素材图像填充。
2、载入素材图像。
3、使用素材图像去填充蒙版图。核心就是上面的两个for循环。
4、将蒙版与模板图像进行融合,改变其像素权值就可以生成蒙太奇图像了。
本文使用较为简单,也比较容易理解的程序生成蒙太奇图像。网上也有许多是使用直方图匹配——将模板图像分割成不等分区域,然后使用素材库中的图像与这些区域一一进行直方图匹配,找到最匹配的那张图像填充该区域。有兴趣的小伙伴可以尝试一下这种方法!!
以上就是c++ opencv生成蒙太奇图像的示例详解的详细内容,更多关于c++ opencv蒙太奇图像的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-04 13:41:33,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/720502c5f645f9cd2029ae915181a009.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++ OpenCV生成蒙太奇图像的示例详解.doc
本文 PDF 下载地址:C++ OpenCV生成蒙太奇图像的示例详解.pdf
留言与评论(共有 0 条评论) |