使用c++實現OpenCV圖像橫向&縱向拼接
功能函數
// 圖像拼接 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++實現OpenCV圖像橫向&縱向拼接的詳細內容,更多關於c++實現OpenCV圖像的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- C++ OpenCV實戰之手寫數字識別
- 基於C++ OpenCV制作電子相冊查看器
- 基於OpenCV自定義色條實現灰度圖上色功能代碼
- C++基於灰度圖上色GrayToColorFromOther的實現
- C++ OpenCV生成蒙太奇圖像的示例詳解