C++ 拼接图片(apollo框架下)

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实现几幅图像拼接成一整幅大图

opencv改变图像大小cvResize和resize

c++从txt按行读取字符串

用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

在这里插入图片描述
C中 snprintf()函数的作用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值