本篇內容主要講解“如何使用c++實現OpenCV圖像橫向和縱向拼接”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何使用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; }
圖1 橫向拼接
圖2 縱向拼接
到此,相信大家對“如何使用c++實現OpenCV圖像橫向和縱向拼接”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。