使用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; }
測試效果
以上就是使用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的使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05C++ OpenCV實戰(zhàn)之網(wǎng)孔檢測的實現(xiàn)
這篇文章主要介紹了如何利用C++和OpenCV實現(xiàn)網(wǎng)孔檢測,文中的示例代碼講解詳細,對我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-05-05