最近学校里有个活动,要求把几张截图拼接成一张长图,但是我在手机上没找到这个功能,于是打算用opencv写一个程序。
这个程序有两个功能,第一个是将图片路径变成opencv支持的格式(去掉前后引号,将“\”改为“/”),第二个是拼接图片。
此函数实现整理图片地址的格式,用于opencv的imread
string process(string str){
for(int i=0;i<str.size();i++){
char text_tmp=str[i];
if(text_tmp=='\\'){ //"\\"代表一个"\"字符
str[i]='/';
}
if(text_tmp=='"'){
str[i]=' ';
}
}
str.erase(0, str.find_first_not_of(" ")); //删除0到第一个不是空格的字符
str.erase(str.find_last_not_of(" ")+1, str.length());//删除最后一个不是空格的字符到字符串结尾
return str;
}
此代码实现opencv图片拼接
Mat img1=imread(first_path);
Mat img2=imread(second_path);
int w1=img1.cols; int h1=img1.rows;
int w2=img2.cols; int h2=img2.rows;
int height=h1+h2;
int width=max(w1,w2);
Mat img(height,width,CV_8UC3,Scalar::all(0)); //注意这里(height,width)
Mat roi_1=img(Rect(0,0,w1,h1));
Mat roi_2=img(Rect(0,h1,w2,h2)); //注意这里(0,h1,w2,h2),不是(0,h1,w2,h1+h2) ROI
img1.copyTo(roi_1);
img2.copyTo(roi_2);
imshow("img",img);
imwrite("img.jpg", img);
waitKey(0);
这是最终代码
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
string process(string str){
for(int i=0;i<str.size();i++){
char text_tmp=str[i];
if(text_tmp=='\\'){ //"\\"代表一个"\"字符
str[i]='/';
}
if(text_tmp=='"'){
str[i]=' ';
}
}
str.erase(0, str.find_first_not_of(" "));
//删除0到第一个不是空格的字符
str.erase(str.find_last_not_of(" ")+1, str.length());
//删除最后一个不是空格的字符到字符串结尾
return str;
}
int main()
{
string first_path,second_path;
cin>>first_path;
cin>>second_path;
first_path=process(first_path); //处理后不带前后的双引号。且用“/”
second_path=process(second_path);
Mat img1=imread(first_path);
Mat img2=imread(second_path);
int w1=img1.cols; int h1=img1.rows;
int w2=img2.cols; int h2=img2.rows;
int height=h1+h2;
int width=max(w1,w2);
Mat img(height,width,CV_8UC3,Scalar::all(0)); //注意这里(height,width)
Mat roi_1=img(Rect(0,0,w1,h1));
Mat roi_2=img(Rect(0,h1,w2,h2)); //注意这里(0,h1,w2,h2),不是(0,h1,w2,h1+h2) ROI
img1.copyTo(roi_1);
img2.copyTo(roi_2);
imshow("img",img);
imwrite("img.jpg", img);
waitKey(0);
return 0;
}
这是拼接完的图片(截图)