欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接

 更新時間:2021年08月30日 15:38:38   作者:翟天保Steven  
這篇文章主要介紹了使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實現(xiàn)如“長圖拼接王”這類小程序的類似功能,大家可以將該函數(shù)封裝在軟件中自由使用

功能函數(shù)

// 圖像拼接
cv::Mat ImageSplicing(vector<cv::Mat> images,int type)
{
	if (type != 0 && type != 1)
		type = 0;
	
	int num = images.size();
	int newrow = 0;
	int newcol = 0;
	cv::Mat result;
 	// 橫向拼接
	if (type == 0)
	{
		int minrow = 10000;
		for (int i = 0; i < num; ++i)
		{
			if (minrow > images[i].rows)
				minrow = images[i].rows;
		}
		newrow = minrow;
		for (int i = 0; i < num; ++i)
		{
			int tcol = images[i].cols*minrow / images[i].rows;
			int trow = newrow;
			cv::resize(images[i], images[i], cv::Size(tcol, trow));
			newcol += images[i].cols;
			if (images[i].type() != images[0].type())
				images[i].convertTo(images[i], images[0].type());
		}
		result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));
 		cv::Range rangerow, rangecol;
		int start = 0;
		for (int i = 0; i < num; ++i)
		{
			rangerow = cv::Range((newrow - images[i].rows) / 2, (newrow - images[i].rows) / 2 + images[i].rows);
			rangecol = cv::Range(start, start + images[i].cols);
			images[i].copyTo(result(rangerow, rangecol));
			start += images[i].cols;
		}
	}
	// 縱向拼接
	else if (type == 1) {
		int mincol = 10000;
		for (int i = 0; i < num; ++i)
		{
			if (mincol > images[i].cols)
				mincol = images[i].cols;
		}
		newcol = mincol;
		for (int i = 0; i < num; ++i)
		{
			int trow = images[i].rows*mincol / images[i].cols;
			int tcol = newcol;
			cv::resize(images[i], images[i], cv::Size(tcol, trow));
			newrow += images[i].rows;
			if (images[i].type() != images[0].type())
				images[i].convertTo(images[i], images[0].type());
		}
		result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));
 
		cv::Range rangerow, rangecol;
		int start = 0;
		for (int i = 0; i < num; ++i)
		{
			rangecol= cv::Range((newcol - images[i].cols) / 2, (newcol - images[i].cols) / 2 + images[i].cols);
			rangerow = cv::Range(start, start + images[i].rows);
			images[i].copyTo(result(rangerow, rangecol));
			start += images[i].rows;
		}
	}
	return result;
}

測試代碼

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
cv::Mat ImageSplicing(vector<cv::Mat> images, int type);
int main()
{
	cv::Mat src1 = imread("1.jpg");
	cv::Mat src2 = imread("2.jpg");
	cv::Mat src3 = imread("3.jpg");
	cv::Mat src4 = imread("4.jpg");
	vector<cv::Mat> images;
	images.push_back(src1);
	images.push_back(src2);
	images.push_back(src3);
	images.push_back(src4);
 
	// 0為橫向
	cv::Mat result1 = ImageSplicing(images, 0);
	// 1為縱向
	cv::Mat result2 = ImageSplicing(images, 1);
	imwrite("result1.jpg",result1);
	imwrite("result2.jpg",result2);
 	return 0;
}
// 圖像拼接
cv::Mat ImageSplicing(vector<cv::Mat> images,int type)
{
	if (type != 0 && type != 1)
		type = 0;
	int num = images.size();
	int newrow = 0;
	int newcol = 0;
	cv::Mat result;
 	// 橫向拼接
	if (type == 0)
	{
		int minrow = 10000;
		for (int i = 0; i < num; ++i)
		{
			if (minrow > images[i].rows)
				minrow = images[i].rows;
		}
		newrow = minrow;
		for (int i = 0; i < num; ++i)
		{
			int tcol = images[i].cols*minrow / images[i].rows;
			int trow = newrow;
			cv::resize(images[i], images[i], cv::Size(tcol, trow));
			newcol += images[i].cols;
			if (images[i].type() != images[0].type())
				images[i].convertTo(images[i], images[0].type());
		}
		result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));
 
		cv::Range rangerow, rangecol;
		int start = 0;
		for (int i = 0; i < num; ++i)
		{
			rangerow = cv::Range((newrow - images[i].rows) / 2, (newrow - images[i].rows) / 2 + images[i].rows);
			rangecol = cv::Range(start, start + images[i].cols);
			images[i].copyTo(result(rangerow, rangecol));
			start += images[i].cols;
		}
	}
	// 縱向拼接
	else if (type == 1) {
		int mincol = 10000;
		for (int i = 0; i < num; ++i)
		{
			if (mincol > images[i].cols)
				mincol = images[i].cols;
		}
		newcol = mincol;
		for (int i = 0; i < num; ++i)
		{
			int trow = images[i].rows*mincol / images[i].cols;
			int tcol = newcol;
			cv::resize(images[i], images[i], cv::Size(tcol, trow));
			newrow += images[i].rows;
			if (images[i].type() != images[0].type())
				images[i].convertTo(images[i], images[0].type());
		}
		result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));
 		cv::Range rangerow, rangecol;
		int start = 0;
		for (int i = 0; i < num; ++i)
		{
			rangecol= cv::Range((newcol - images[i].cols) / 2, (newcol - images[i].cols) / 2 + images[i].cols);
			rangerow = cv::Range(start, start + images[i].rows);
			images[i].copyTo(result(rangerow, rangecol));
			start += images[i].rows;
		}
	}
	
	return result;
}

測試效果 

 
圖1 橫向拼接
圖2 縱向拼接

以上就是使用c++實現(xiàn)OpenCV圖像橫向&縱向拼接的詳細內(nèi)容,更多關(guān)于c++實現(xiàn)OpenCV圖像的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入Main函數(shù)中的參數(shù)argc,argv的使用詳解

    深入Main函數(shù)中的參數(shù)argc,argv的使用詳解

    本篇文章是對Main函數(shù)中的參數(shù)argc,argv的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言簡明介紹指針的使用

    C語言簡明介紹指針的使用

    C語言這門課程在計算機的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對指針的基礎(chǔ)做詳盡的介紹
    2022-06-06
  • 如何用C語言生成簡單格式的xml

    如何用C語言生成簡單格式的xml

    本篇文章是對使用C語言生成簡單格式的xml的實現(xiàn)代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ 中Vector常用基本操作

    C++ 中Vector常用基本操作

    標準庫vector類型是C++中使用較多的一種類模板,本文給大家分享C++ 中Vector常用基本操作,感興趣的朋友一起看看吧
    2017-10-10
  • C語言數(shù)據(jù)存儲歸類介紹

    C語言數(shù)據(jù)存儲歸類介紹

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08
  • C++利用宏實現(xiàn)類成員反射詳解

    C++利用宏實現(xiàn)類成員反射詳解

    這篇文章主要為大家詳細介紹了C++如何利用宏實現(xiàn)類成員反射,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,有興趣的小伙伴可以了解一下
    2024-01-01
  • C語言開發(fā)中的常見錯誤詳解

    C語言開發(fā)中的常見錯誤詳解

    這個分欄是對于使用C語言編程過程中可能會出現(xiàn)的一些錯誤而進行的說明,更多的錯誤示例將會在后面的內(nèi)容里進行演示。希望這個分欄的內(nèi)容可以幫助剛學(xué)編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗
    2022-05-05
  • C語言算法練習(xí)之求二維數(shù)組最值問題

    C語言算法練習(xí)之求二維數(shù)組最值問題

    這篇文章主要為大家介紹了C語言算法練習(xí)中求二維數(shù)組最值的實現(xiàn)方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-09-09
  • C++ OpenCV實戰(zhàn)之網(wǎng)孔檢測的實現(xiàn)

    C++ OpenCV實戰(zhàn)之網(wǎng)孔檢測的實現(xiàn)

    這篇文章主要介紹了如何利用C++和OpenCV實現(xiàn)網(wǎng)孔檢測,文中的示例代碼講解詳細,對我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下
    2022-05-05
  • set_new_handler(0)有什么用

    set_new_handler(0)有什么用

    本文主要介紹了set_new_handler(0)有什么用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論