千家信息网

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 #includeusing 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);        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;        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如何生成蒙太奇图像"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0