C++ , image_combine.cc, 读txt的方式将001-003目录下名字相同的图片拼接起来,
#include <iostream>
#include<fstream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
int main(int argc,char **argv)
{
std::ifstream readFile("/apollo/data/xuehui_test/jpg_list.txt");
std::string line;
std::string a_src;
std::string b_src;
std::string c_src;
std::string save_path;
if(readFile)
{
while (std::getline(readFile, line))
{
a_src=line; // /home/moonx/apollo/data/xuehui_test/001/00001.jpg
b_src=line.replace(line.find("001"),3,"002"); //从第一个"001"位置开始的3个字符替换成"002"(line被改变)
c_src=line.replace(line.find("002"),3,"003");
std::cout<< line <<std::endl;
std::cout<< b_src <<std::endl;
std::cout<< c_src <<std::endl;
cv::Mat combine1,combine2;
cv::Mat a=cv::imread(a_src);
cv::Mat b=cv::imread(b_src);
cv::Mat c=cv::imread(c_src);
//将b改为c尺寸,把 b和c 竖直拼一起 得 combine1
cv::Size size_b2 = cv::Size(c.cols, c.rows);
cv::Mat b2;
cv::resize(b,b2, size_b2);
cv::vconcat(b2, c, combine1);
//将a改为与combine1可水平拼接的尺寸 把a和combine1水平拼在一起 得 combine2
cv::Size size_a2 = cv::Size(c.cols, 2*c.rows);
cv::Mat a2;
cv::resize(a,a2, size_a2);
cv::hconcat(a2, combine1, combine2);
cv::namedWindow("Combine", CV_WINDOW_NORMAL);
cv::resizeWindow("Combine", 1920, 1080 );
cv::imshow("Combine",combine2);
cv::waitKey(10); //可能读取图片加拼接的时间已经大于10ms,显示效果没有1秒100张
//保存图片
save_path=line.replace(line.find("003"),3,"image_combine");
std::cout<<save_path<<std::endl;
cv::imwrite(save_path, combine2);
}
}
else
{
std::cout<<"No such file"<<std::endl;
}
return 0;
system("PAUSE");
}
#!/bin/bash
ls -R /apollo/data/xuehui_test/001/*.jpg > /apollo/data/xuehui_test/jpg_list.txt
./bazel-bin/modules/perception/tools/image_combine/image_combine
#jpg_list.txt
#/apollo/data/xuehui_test/001/00001.jpg
#/apollo/data/xuehui_test/001/00002.jpg
#/apollo/data/xuehui_test/001/00003.jpg
#/apollo/data/xuehui_test/001/00004.jpg
#/apollo/data/xuehui_test/001/00005.jpg
#...
BUILD
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])
cc_binary(
name = "image_combine", #编译结果的名字
#hdrs = [
# "image_show.h" #头文件,我这里不需要
#]
srcs = [
"image_combine.cc", #源码名字
],
deps = [
"@opencv3", #依赖
],
)
执行shell 就会在/apollo/data/xuehui_test/image_combine下生成拼接好的图,但是如果c如果读不到想要的图片,或者图片名字后缀不标准会报错。下面是生成结果:
参考:
Opencv实现几幅图像拼接成一整幅大图
用str替换指定字符串从起始位置pos开始长度为len的字符
附加,另一种办法,用到了容器
#include <iostream>
#include <fstream>
#include <string>
#include <opencv2/opencv.hpp>
#include <vector>
#include <chrono>
using namespace std; //我不加这句,用vector的时候,编译会报错
int main()
{
std::ifstream jpg_001("/apollo/data/xuehui_test/jpg_001_list.txt");
std::ifstream jpg_002("/apollo/data/xuehui_test/jpg_002_list.txt");
std::ifstream jpg_003("/apollo/data/xuehui_test/jpg_003_list.txt");
std::vector<string>vec_001;
std::vector<string>vec_002;
std::vector<string>vec_003;
std::string line;
char filename[10];
std::string save_path;
save_path = "/apollo/data/xuehui_test/image_combine/";
int all_num=0;
while (getline(jpg_001, line))
{
vec_001.push_back(line);
all_num+=1;
}
while (getline(jpg_002, line))
{
vec_002.push_back(line);
}
while (getline(jpg_003, line))
{
vec_003.push_back(line);
}
//创建一张纯色图
cv::Mat m = cv::Mat(cv::Size(1920, 1080), CV_8UC3, cv::Scalar(0, 0, 0));
for (int i; i<=all_num; i++)
{
auto start = std::chrono::steady_clock::now();
std::cout<<vec_001[i]<<std::endl;
cv::Mat combine1, combine2, combine3;
cv::Mat a=cv::imread(vec_001[i]);
cv::Mat b=cv::imread(vec_002[i]);
cv::Mat c=cv::imread(vec_003[i]);
//将b改为m尺寸,把 b和m 竖直拼一起 得 combine1
cv::Size size_m = cv::Size(m.cols, m.rows);
cv::Mat b2;
cv::resize(b,b2, size_m);
cv::vconcat(b2, m, combine1);
// //将a改为与combine1可水平拼接的尺寸 把a左拼到combine1 得 combine2
cv::Size size_a2 = cv::Size(combine1.cols*2/3, combine1.rows);
cv::Mat a2;
cv::resize(a,a2, size_a2);
cv::hconcat( a2,combine1, combine2);
// //将c改为与combine2可水平拼接的尺寸 把c右拼到combine2 得 combine3
cv::Size size_c2 = cv::Size(combine1.cols*2/3, combine2.rows);
cv::Mat c2;
cv::resize(c,c2, size_c2);
cv::hconcat(combine2,c2, combine3);
cv::namedWindow("Combine", CV_WINDOW_NORMAL);
cv::resizeWindow("Combine", 1920, 1080 );
cv::imshow("Combine",combine3);
cv::waitKey(10); //可能是读取图片加拼接的时间已经大于10ms,显示效果没有1秒100张
//计算程序耗时模块
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double, std::milli> elapsed = end - start; // std::micro 表示以微秒为时间单位, std::milli 表示以毫秒为时间单位。
std::cout<< "time: " << elapsed.count()<< "ms" << std::endl;
snprintf(filename, sizeof(filename), "%06d", i); //输出一个十进制的数,占六位,若不够六位则在这个数的前面补零
std::cout<< save_path + filename + ".jpg"<<std::endl; //好像字符串过长就不能直接拼接,需要赋给变量。
cv::imwrite(save_path + filename + ".jpg" , combine3);
}
system("PAUSE");
return 0;
}
#!/bin/bash
ls -R /apollo/data/xuehui_test/demo_1/output/*.jpg > /apollo/data/xuehui_test/jpg_001_list.txt
ls -R /apollo/data/xuehui_test/002/*.jpg > /apollo/data/xuehui_test/jpg_002_list.txt
ls -R /apollo/data/xuehui_test/003/*.jpg > /apollo/data/xuehui_test/jpg_003_list.txt
./bazel-bin/modules/perception/tools/image_combine/image_combine