溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++?OpenCV如何生成蒙太奇圖像

發(fā)布時(shí)間:2022-01-11 11:24:43 來(lái)源:億速云 閱讀:148 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“C++ OpenCV如何生成蒙太奇圖像”,在日常操作中,相信很多人在C++ OpenCV如何生成蒙太奇圖像問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++ OpenCV如何生成蒙太奇圖像”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

一、輸入模板圖像

C++?OpenCV如何生成蒙太奇圖像

原圖如圖所示。我們將對(duì)此圖生成蒙太奇圖像。

    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個(gè)block,即使用30x30張素材圖像來(lái)生成我們的蒙太奇圖像。

二、讀取素材圖像

所有素材圖像。

//獲取文件夾下所有圖像路徑
int getImagePathList(string folder, vector<String> &imagePathList)
{
	glob(folder, imagePathList);
	return 0;
}

我們定義getImagePathList函數(shù)獲取文件夾下所有圖像的路徑。

	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;

我們將讀取進(jìn)來(lái)的所有素材圖像都resize成 Size(step_x, step_y)大小,并把它們都push_back到images容器內(nèi),以便后續(xù)使用。

三、生成蒙太奇模板

	int rows = src.rows;
	int cols = src.cols;
	//height:表示生成的蒙太奇圖像需要多少?gòu)埶夭膱D像填充rows
	//width:表示生成的蒙太奇圖像需要多少?gòu)埶夭膱D像填充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表示當(dāng)前素材圖像的索引
			int index = i * width + j;

			//將當(dāng)前素材圖像拷貝到temp零時(shí)變量
			images[index].copyTo(temp);

			//將temp圖像賦值給需要生成的蒙太奇圖像對(duì)應(yīng)區(qū)域
			temp = dst(Rect(j * step_x, i * step_y, step_x, step_y));
		}
	}

	imshow("dst", dst);

通過(guò)兩個(gè)for循環(huán)就可以遍歷到每個(gè)蒙版區(qū)域。這個(gè)類(lèi)似于遍歷圖像的所有像素,只不過(guò)我們把步長(zhǎng)加大了而已。整個(gè)代碼的核心就是以下這兩句。

	//將當(dāng)前素材圖像拷貝到temp零時(shí)變量
	images[index].copyTo(temp);

	//將temp圖像賦值給需要生成的蒙太奇圖像對(duì)應(yīng)區(qū)域
	temp = dst(Rect(j * step_x, i * step_y, step_x, step_y));

將所有的素材圖像copy到指定區(qū)域就可以生成蒙版圖像啦。接下來(lái)我們就得對(duì)這個(gè)蒙版圖像做像素處理了。

四、生成蒙太奇圖像

	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);

我們通過(guò)遍歷模板圖像所有像素,并改變它們的權(quán)值,就可以得到蒙太奇圖像啦。

C++?OpenCV如何生成蒙太奇圖像

這就是我們生成的蒙太奇圖像

五、源碼

#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 image!" << endl;
		system("pause");
		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:表示生成的蒙太奇圖像需要多少?gòu)埶夭膱D像填充rows
	//width:表示生成的蒙太奇圖像需要多少?gòu)埶夭膱D像填充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表示當(dāng)前素材圖像的索引
			int index = i * width + j;

			//將當(dāng)前素材圖像拷貝到temp零時(shí)變量
			images[index].copyTo(temp);

			//將temp圖像賦值給需要生成的蒙太奇圖像對(duì)應(yīng)區(qū)域
			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("pause");
	return 0;
}

到此,關(guān)于“C++ OpenCV如何生成蒙太奇圖像”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI