使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接
更新時(shí)間:2021年08月30日 15:38:38 作者:翟天保Steven
這篇文章主要介紹了使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實(shí)現(xiàn)如“長(zhǎng)圖拼接王”這類小程序的類似功能,大家可以將該函數(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; }
測(cè)試代碼
#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; }
測(cè)試效果
以上就是使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接的詳細(xì)內(nèi)容,更多關(guān)于c++實(shí)現(xiàn)OpenCV圖像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- C++中string使用+號(hào)與int拼接方式
- 詳解C++?OpenCV實(shí)現(xiàn)圖像拼接的原理及方法
- C++ OpenCV實(shí)戰(zhàn)之圖像全景拼接
- C++實(shí)現(xiàn)批量圖片拼接
- 基于C++的攝像頭圖像采集及拼接程序的簡(jiǎn)單實(shí)現(xiàn)
- C++ 兩個(gè)vector對(duì)象拼接方式
- C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)
- 關(guān)于c++11與c風(fēng)格路徑拼接的速度對(duì)比
- C++使用join拼接字符串的技巧
- C++整數(shù)拼接技巧大揭秘
相關(guān)文章
深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
本篇文章是對(duì)Main函數(shù)中的參數(shù)argc,argv的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言開(kāi)發(fā)中的常見(jiàn)錯(cuò)誤詳解
這個(gè)分欄是對(duì)于使用C語(yǔ)言編程過(guò)程中可能會(huì)出現(xiàn)的一些錯(cuò)誤而進(jìn)行的說(shuō)明,更多的錯(cuò)誤示例將會(huì)在后面的內(nèi)容里進(jìn)行演示。希望這個(gè)分欄的內(nèi)容可以幫助剛學(xué)編程的小白少走一些彎路,以及吸取更多的編碼經(jīng)驗(yàn)2022-05-05C語(yǔ)言算法練習(xí)之求二維數(shù)組最值問(wèn)題
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中求二維數(shù)組最值的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09C++ OpenCV實(shí)戰(zhàn)之網(wǎng)孔檢測(cè)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用C++和OpenCV實(shí)現(xiàn)網(wǎng)孔檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-05-05